OGR data source with driver: ESRI Shapefile
Source: "C:\Users\Leslie\Documents\School\Term 5\HASS - Making Maps I\Project\MakingMaps\sentiment_map\sg-shape", layer: "sg-all"
with 1 features
It has 13 fields
Case 1: Sentiments on Weekdays vs Weekends
t_wday <- tweets %>%
filter(weekday < 6) # filter only tweets made on weekdays
t_wend <- tweets %>%
filter(weekday > 5) # filter only tweets made on weekends
i_wday <- insta %>%
filter(weekday < 6) # filter only igs made on weekdays
i_wend <- insta %>%
filter(weekday > 5) # filter only igs made on weekends
Case 2: Sentiments across various Time Periods
We will be dividing the data into 4 time periods:
- SGT 00:00 - 05:59
- SGT 06:00 - 11:59
- SGT 12:00 - 17:59
- SGT 18:00 - 23:59
# Twitter
t_time1 <- tweets %>%
filter(hour(date) < 6) # filter tweets made between 12am - 6am
t_time2 <- tweets %>%
filter(hour(date) >= 6) %>%
filter(hour(date) < 12) # filter tweets made between 6am - 12pm
t_time3 <- tweets %>%
filter(hour(date) >= 12) %>%
filter(hour(date) < 18) # filter tweets made between 12pm - 6pm
t_time4 <- tweets %>%
filter(hour(date) >= 18) # filter tweets made between 6pm - 12am
# Instagram
i_time1 <- insta %>%
filter(hour(date) < 6) # filter igs made between 12am - 6am
i_time2 <- insta %>%
filter(hour(date) >= 6) %>%
filter(hour(date) < 12) # filter igs made between 6am - 12pm
i_time3 <- insta %>%
filter(hour(date) >= 12) %>%
filter(hour(date) < 18) # filter igs made between 12pm - 6pm
i_time4 <- insta %>%
filter(hour(date) >= 18) # filter igs made between 6pm - 12am
<<<<<<< HEAD
LS0tDQp0aXRsZTogIk9kZHMgUmF0aW8gQ2FzZSBTdHVkaWVzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzcCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHJhc3RlcikNCmxpYnJhcnkocmdlb3MpDQpsaWJyYXJ5KHJnZGFsKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHJhc3RlclZpcykNCnJlcXVpcmUoc3BhdGlhbEVjbykNCmxpYnJhcnkocGxvdGx5KQ0KDQpzZXQuc2VlZCgxKQ0KDQojIFJldHJpZXZlZCB3aXRoIHRoYW5rcyBmcm9tIGh0dHA6Ly9zdHJpbWFzLmNvbS9zcGF0aWFsL2hleGFnb25hbC1ncmlkcy8NCm1ha2VfZ3JpZCA8LSBmdW5jdGlvbih4LCBjZWxsX2RpYW1ldGVyLCBjZWxsX2FyZWEsIGNsaXAgPSBGQUxTRSkgew0KICBpZiAobWlzc2luZyhjZWxsX2RpYW1ldGVyKSkgew0KICAgIGlmIChtaXNzaW5nKGNlbGxfYXJlYSkpIHsNCiAgICAgIHN0b3AoIk11c3QgcHJvdmlkZSBjZWxsX2RpYW1ldGVyIG9yIGNlbGxfYXJlYSIpDQogICAgfSBlbHNlIHsNCiAgICAgIGNlbGxfZGlhbWV0ZXIgPC0gc3FydCgyICogY2VsbF9hcmVhIC8gc3FydCgzKSkNCiAgICB9DQogIH0NCiAgZXh0IDwtIGFzKGV4dGVudCh4KSArIGNlbGxfZGlhbWV0ZXIsICJTcGF0aWFsUG9seWdvbnMiKQ0KICBwcm9qZWN0aW9uKGV4dCkgPC0gcHJvamVjdGlvbih4KQ0KICAjIGdlbmVyYXRlIGFycmF5IG9mIGhleGFnb24gY2VudGVycw0KICBnIDwtIHNwc2FtcGxlKGV4dCwgdHlwZSA9ICJoZXhhZ29uYWwiLCBjZWxsc2l6ZSA9IGNlbGxfZGlhbWV0ZXIsIA0KICAgICAgICAgICAgICAgIG9mZnNldCA9IGMoMC41LCAwLjUpKQ0KICAjIGNvbnZlcnQgY2VudGVyIHBvaW50cyB0byBoZXhhZ29ucw0KICBnIDwtIEhleFBvaW50czJTcGF0aWFsUG9seWdvbnMoZywgZHggPSBjZWxsX2RpYW1ldGVyKQ0KICAjIGNsaXAgdG8gYm91bmRhcnkgb2Ygc3R1ZHkgYXJlYSwuDQogIGlmIChjbGlwKSB7DQogICAgZyA8LSBnSW50ZXJzZWN0aW9uKGcsIHgsIGJ5aWQgPSBUUlVFKQ0KICB9IGVsc2Ugew0KICAgIGcgPC0gZ1t4LCBdDQogIH0NCiAgIyBjbGVhbiB1cCBmZWF0dXJlIElEcw0KICByb3cubmFtZXMoZykgPC0gYXMuY2hhcmFjdGVyKDE6bGVuZ3RoKGcpKQ0KICByZXR1cm4oZykNCn0NCiAgICANCiMgcmVhZCBpbiBmaWxlcw0KdHdlZXRzIDwtIGludmlzaWJsZShyZWFkX2NzdigiZW1vamlfdHJ1bmMuY3N2IikpDQp0d2VldHMgPC0gdHdlZXRzICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGFzX2RhdGV0aW1lKGNyZWF0ZWRfYXQvMTAwMCwgdHogPSAiQXNpYS9TaW5nYXBvcmUiKSkgJT4lDQogIG11dGF0ZSh3ZWVrZGF5ID0gd2RheShkYXRlKSkNCmluc3RhIDwtIGludmlzaWJsZShyZWFkX2NzdigiaW5zdGFncmFtX3RydW5jLmNzdiIpKQ0Kc2hhcGUgPC0gaW52aXNpYmxlKHJlYWRPR1IoZHNuID0gJ3NnLXNoYXBlJywgbGF5ZXIgPSdzZy1hbGwnKSkNCnNoYXBlIDwtIGdCdWZmZXIoc2hhcGUsIGJ5aWQ9VFJVRSwgd2lkdGg9MCkgIyBjbGVhbiB1cCBwb2x5Z29ucw0KYGBgDQoNCioqQ2FzZSAxOiBTZW50aW1lbnRzIG9uIFdlZWtkYXlzIHZzIFdlZWtlbmRzKioNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRX0NCnRfd2RheSA8LSB0d2VldHMgJT4lDQogIGZpbHRlcih3ZWVrZGF5IDwgNikgIyBmaWx0ZXIgb25seSB0d2VldHMgbWFkZSBvbiB3ZWVrZGF5cw0KICANCnRfd2VuZCA8LSB0d2VldHMgJT4lDQogIGZpbHRlcih3ZWVrZGF5ID4gNSkgIyBmaWx0ZXIgb25seSB0d2VldHMgbWFkZSBvbiB3ZWVrZW5kcyAgDQogIA0KaV93ZGF5IDwtIGluc3RhICU+JQ0KICBmaWx0ZXIod2Vla2RheSA8IDYpICMgZmlsdGVyIG9ubHkgaWdzIG1hZGUgb24gd2Vla2RheXMNCiAgDQppX3dlbmQgPC0gaW5zdGEgJT4lDQogIGZpbHRlcih3ZWVrZGF5ID4gNSkgIyBmaWx0ZXIgb25seSBpZ3MgbWFkZSBvbiB3ZWVrZW5kcyAgDQpgYGANCiAgDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRX0NCiMgY29udmVydCB0byBzcCBwb2ludHMgYW5kIHBvbHlnb24NCnR3ZWV0cyA8LSBkcm9wX25hKHRfd2RheSkNCiMgcCA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHR3ZWV0cywgZGF0YS5mcmFtZShpZD0xOjcyODEzOCkpDQp0d2VldHMuc2YgPC0gc3RfYXNfc2YodHdlZXRzLCBjb29yZHMgPSBjKCdsb24nLCdsYXQnKSwgY3JzPTQzMjYpDQoNCmluc3RhIDwtIGRyb3BfbmEoaV93ZGF5KQ0KaW5zdGEuc2YgPC0gc3RfYXNfc2YoaW5zdGEsIGNvb3Jkcz1jKCdsb24nLCAnbGF0JyksIGNycz00MzI2KQ0KDQojIHBhLmttbCA8LSBzdF9yZWFkKCJwbGFubmluZ19hcmVhLmttbCIpDQojIHBhLnNmIDwtIHN0X2FzX3NmKHBhLmttbCwgY3JzPTQzMjYpDQojIHBhLnV0bSA8LSBhcyhzdF96bShwYS5zZiksICJTcGF0aWFsIikNCiMgcGEudXRtIDwtIGdCdWZmZXIocGEudXRtLCBieWlkPVRSVUUsIHdpZHRoPTApICMgY2xlYW4gdXAgcG9seWdvbnMNCiMgc2hhcGVfdXRtIDwtIHNwVHJhbnNmb3JtKHNoYXBlLCBDUlMocHJvajRzdHJpbmcoc2hhcGUpKSkNCmhleF9ncmlkIDwtIG1ha2VfZ3JpZChzaGFwZV91dG0sIGNlbGxfYXJlYSA9IDAuMDAwMSwgY2xpcCA9IFQpDQpoZXguc2YgPC0gc3RfYXNfc2YoaGV4X2dyaWQsIGNycz00MzI2KQ0KaGV4LnNmIDwtIHRpYmJsZTo6cm93aWRfdG9fY29sdW1uKGhleC5zZiwgImhleElEIikNCg0KIyBwb2ludHMgaW4gcG9seWdvbg0KY29sbmFtZXModHdlZXRzLnNmKSA8LSBjKCJ0Lm5lZyIsICJ0Lm5ldSIsICJ0LnBvcyIsICJ0LmNyZWF0ZWRfYXQiLCAidC5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KY29sbmFtZXMoaW5zdGEuc2YpIDwtIGMoImkuY3JlYXRlZF9hdCIsICJpLnBvcyIsICJpLm5ldSIsICJpLm5lZyIsICJpLnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQoNCnQuam9pbiA8LSBzdF9qb2luKHR3ZWV0cy5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KdC5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUodC5qb2luKQ0KdC5qb2luLnN1bW1hcnkgPC0gdC5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZSh0LmNvdW50ID0gbigpLCB0LnBvcyA9IHN1bSh0LnBvcyksIHQubmVnID0gc3VtKHQubmVnKSwgdC5uZXUgPSBzdW0odC5uZXUpKSANCmkuam9pbiA8LSBzdF9qb2luKGluc3RhLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQppLmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZShpLmpvaW4pDQppLmpvaW4uc3VtbWFyeSA8LSBpLmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKGkuY291bnQgPSBuKCksIGkucG9zID0gc3VtKGkucG9zKSwgaS5uZWcgPSBzdW0oaS5uZWcpLCBpLm5ldSA9IHN1bShpLm5ldSkpIA0KDQojIEFkZCBkZWZhdWx0IHZhbHVlcyBmb3IgbWlzc2luZyBoZXhhZ29ucw0KZm9yIChpIGluIGhleC5zZiRoZXhJRCkgew0KICBpZiAoIShpICVpbiUgaS5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgaS5qb2luLnN1bW1hcnkgPC0gcmJpbmQoaS5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUoaS5jb3VudD0xLCBpLnBvcz0wLCBpLm5lZz0wLCBpLm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KICBpZiAoIShpICVpbiUgdC5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgdC5qb2luLnN1bW1hcnkgPC0gcmJpbmQodC5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUodC5jb3VudD0xLCB0LnBvcz0wLCB0Lm5lZz0wLCB0Lm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KfQ0KDQpqb2luLnN1bW1hcnkgPC0gbWVyZ2UodC5qb2luLnN1bW1hcnksIGkuam9pbi5zdW1tYXJ5LCBieT0iaGV4SUQiKQ0KI2pvaW4uc3VtbWFyeSA8LSBqb2luLnN1bW1hcnkgJT4lIHNlbGVjdCgndC5jb3VudCcsICd0LnBvcycsICd0Lm5lZycsICd0Lm5ldScsICdpLmNvdW50JywgJ2kucG9zJywgJ2kubmVnJywgJ2kubmV1JywgJ2hleElEJykgJT4lIGRyb3BfbmEoKQ0KDQprbWwuZGF0YSA8LSBtZXJnZShqb2luLnN1bW1hcnksIGhleC5zZiwgYnkgPSAiaGV4SUQiKSAlPiUgc3RfYXNfc2YoKQ0Ka21sLmRhdGEgPC0gc3RfYXNfc2Yoa21sLmRhdGEpDQprbWwuZGF0YSA8LSBrbWwuZGF0YSAlPiUgbXV0YXRlKHQubm9ybSA9ICh0LnBvcy10Lm5lZykvdC5jb3VudCwgaS5ub3JtID0gKGkucG9zLWkubmVnKS9pLmNvdW50LCBvZGRzPXQucG9zL2kucG9zKQ0Ka21sLmRhdGFbIWlzLmZpbml0ZShrbWwuZGF0YSRvZGRzKSxdJG9kZHMgPC0gMA0KIyBnZ3Bsb3Qoa21sLmRhdGEpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHg9b2RkcyksIGJpbnM9MzApDQoNCiMgUGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgb2Rkcw0KcCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IGttbC5kYXRhLCBhZXMoZmlsbD1vZGRzLCBnZW9tZXRyeT1nZW9tZXRyeSwgdGV4dD1wYXN0ZTAoIk9kZHMgUmF0aW86ICIsIG9kZHMpKSwgbHdkPTApICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX3NmKCkgKw0KICAjIHNjYWxlX2ZpbGxfdmlyaWRpcygNCiAgIyAgIGJyZWFrcz1jKDAsMC4yNSwwLjMsMC4zNSwwLjQsMC40NSksDQogICMgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICMgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICMgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgIyAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgIyAgICAgbnJvdz0xKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcigNCiAgICBwYWxldHRlPSJTcGVjdHJhbCIsDQogICAgbGltaXRzPWMoMCwyKSwNCiAgICBicmVha3M9YygwLDAuMywwLjYsMSwxLjUsMiksDQogICAgbmEudmFsdWU9ImdyZXkiLA0KICAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICAgICBucm93PTEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU2VudGltZW50IE9kZHMgUmF0aW8gb24gV2Vla2RheXMiLA0KICAgIHN1YnRpdGxlID0gIk5vcm1hbGl6ZWQgU2VudGltZW50IHNjb3JlID0gKFBvc2l0aXZlIC0gTmVnYXRpdmUpL1RvdGFsIENvdW50IiwNCiAgICBjYXB0aW9uID0gIkRhdGE6IEF0ZSBQb29ydGh1aXMgfCBDcmVhdGlvbjogRHJhZ29uIE1pbmlvbnMiDQogICkgKw0KICB0aGVtZSgNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiMyMjIxMWQiKSwgDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLCANCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLCANCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDIyLCBoanVzdD0wLjAxLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAtMC4xLCB0ID0gMC40LCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDE3LCBoanVzdD0wLjAxLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAtMC4xLCB0ID0gMC40MywgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KCBzaXplPTEyLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAwLjMsIHI9LTk5LCB1bml0ID0gImNtIikgKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNywgMC4wOSksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKSwgDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKQ0KICApDQoNCiNwDQpnZ3Bsb3RseShwLCB0b29sdGlwID0gInRleHQiKSAlPiUNCiAgaGlnaGxpZ2h0KA0KICAgICJwbG90bHlfaG92ZXIiLA0KICAgIG9wYWNpdHlEaW0gPSAxDQogICkNCmBgYA0KICANCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFfQ0KIyBjb252ZXJ0IHRvIHNwIHBvaW50cyBhbmQgcG9seWdvbg0KdHdlZXRzIDwtIGRyb3BfbmEodF93ZW5kKQ0KIyBwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUodHdlZXRzLCBkYXRhLmZyYW1lKGlkPTE6NzI4MTM4KSkNCnR3ZWV0cy5zZiA8LSBzdF9hc19zZih0d2VldHMsIGNvb3JkcyA9IGMoJ2xvbicsJ2xhdCcpLCBjcnM9NDMyNikNCg0KaW5zdGEgPC0gZHJvcF9uYShpX3dlbmQpDQppbnN0YS5zZiA8LSBzdF9hc19zZihpbnN0YSwgY29vcmRzPWMoJ2xvbicsICdsYXQnKSwgY3JzPTQzMjYpDQoNCiMgcGEua21sIDwtIHN0X3JlYWQoInBsYW5uaW5nX2FyZWEua21sIikNCiMgcGEuc2YgPC0gc3RfYXNfc2YocGEua21sLCBjcnM9NDMyNikNCiMgcGEudXRtIDwtIGFzKHN0X3ptKHBhLnNmKSwgIlNwYXRpYWwiKQ0KIyBwYS51dG0gPC0gZ0J1ZmZlcihwYS51dG0sIGJ5aWQ9VFJVRSwgd2lkdGg9MCkgIyBjbGVhbiB1cCBwb2x5Z29ucw0KIyBzaGFwZV91dG0gPC0gc3BUcmFuc2Zvcm0oc2hhcGUsIENSUyhwcm9qNHN0cmluZyhzaGFwZSkpKQ0KaGV4X2dyaWQgPC0gbWFrZV9ncmlkKHNoYXBlX3V0bSwgY2VsbF9hcmVhID0gMC4wMDAxLCBjbGlwID0gVCkNCmhleC5zZiA8LSBzdF9hc19zZihoZXhfZ3JpZCwgY3JzPTQzMjYpDQpoZXguc2YgPC0gdGliYmxlOjpyb3dpZF90b19jb2x1bW4oaGV4LnNmLCAiaGV4SUQiKQ0KDQojIHBvaW50cyBpbiBwb2x5Z29uDQpjb2xuYW1lcyh0d2VldHMuc2YpIDwtIGMoInQubmVnIiwgInQubmV1IiwgInQucG9zIiwgInQuY3JlYXRlZF9hdCIsICJ0LnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQpjb2xuYW1lcyhpbnN0YS5zZikgPC0gYygiaS5jcmVhdGVkX2F0IiwgImkucG9zIiwgImkubmV1IiwgImkubmVnIiwgImkuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCg0KdC5qb2luIDwtIHN0X2pvaW4odHdlZXRzLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQp0LmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZSh0LmpvaW4pDQp0LmpvaW4uc3VtbWFyeSA8LSB0LmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKHQuY291bnQgPSBuKCksIHQucG9zID0gc3VtKHQucG9zKSwgdC5uZWcgPSBzdW0odC5uZWcpLCB0Lm5ldSA9IHN1bSh0Lm5ldSkpIA0KaS5qb2luIDwtIHN0X2pvaW4oaW5zdGEuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCmkuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKGkuam9pbikNCmkuam9pbi5zdW1tYXJ5IDwtIGkuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UoaS5jb3VudCA9IG4oKSwgaS5wb3MgPSBzdW0oaS5wb3MpLCBpLm5lZyA9IHN1bShpLm5lZyksIGkubmV1ID0gc3VtKGkubmV1KSkgDQoNCiMgQWRkIGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIGhleGFnb25zDQpmb3IgKGkgaW4gaGV4LnNmJGhleElEKSB7DQogIGlmICghKGkgJWluJSBpLmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICBpLmpvaW4uc3VtbWFyeSA8LSByYmluZChpLmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZShpLmNvdW50PTEsIGkucG9zPTAsIGkubmVnPTAsIGkubmV1PTAsIGhleElEPWkpKQ0KICB9DQogIGlmICghKGkgJWluJSB0LmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICB0LmpvaW4uc3VtbWFyeSA8LSByYmluZCh0LmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZSh0LmNvdW50PTEsIHQucG9zPTAsIHQubmVnPTAsIHQubmV1PTAsIGhleElEPWkpKQ0KICB9DQp9DQoNCmpvaW4uc3VtbWFyeSA8LSBtZXJnZSh0LmpvaW4uc3VtbWFyeSwgaS5qb2luLnN1bW1hcnksIGJ5PSJoZXhJRCIpDQojam9pbi5zdW1tYXJ5IDwtIGpvaW4uc3VtbWFyeSAlPiUgc2VsZWN0KCd0LmNvdW50JywgJ3QucG9zJywgJ3QubmVnJywgJ3QubmV1JywgJ2kuY291bnQnLCAnaS5wb3MnLCAnaS5uZWcnLCAnaS5uZXUnLCAnaGV4SUQnKSAlPiUgZHJvcF9uYSgpDQoNCmttbC5kYXRhIDwtIG1lcmdlKGpvaW4uc3VtbWFyeSwgaGV4LnNmLCBieSA9ICJoZXhJRCIpICU+JSBzdF9hc19zZigpDQprbWwuZGF0YSA8LSBzdF9hc19zZihrbWwuZGF0YSkNCmttbC5kYXRhIDwtIGttbC5kYXRhICU+JSBtdXRhdGUodC5ub3JtID0gKHQucG9zLXQubmVnKS90LmNvdW50LCBpLm5vcm0gPSAoaS5wb3MtaS5uZWcpL2kuY291bnQsIG9kZHM9dC5wb3MvaS5wb3MpDQprbWwuZGF0YVshaXMuZmluaXRlKGttbC5kYXRhJG9kZHMpLF0kb2RkcyA8LSAwDQojIGdncGxvdChrbWwuZGF0YSkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoeD1vZGRzKSwgYmlucz0zMCkNCg0KIyBQbG90IGEgaGlzdG9ncmFtIG9mIHRoZSBvZGRzDQpwIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0ga21sLmRhdGEsIGFlcyhmaWxsPW9kZHMsIGdlb21ldHJ5PWdlb21ldHJ5LCB0ZXh0PXBhc3RlMCgiT2RkcyBSYXRpbzogIiwgb2RkcykpLCBsd2Q9MCkgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgY29vcmRfc2YoKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzKA0KICAjICAgYnJlYWtzPWMoMCwwLjI1LDAuMywwLjM1LDAuNCwwLjQ1KSwNCiAgIyAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgIyAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgIyAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAjICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAjICAgICBucm93PTEpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKA0KICAgIHBhbGV0dGU9IlNwZWN0cmFsIiwNCiAgICBsaW1pdHM9YygwLDIpLA0KICAgIGJyZWFrcz1jKDAsMC4zLDAuNiwxLDEuNSwyKSwNCiAgICBuYS52YWx1ZT0iZ3JleSIsDQogICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgICAgIG5yb3c9MSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJTZW50aW1lbnQgT2RkcyBSYXRpbyBvbiBXZWVrZW5kcyIsDQogICAgc3VidGl0bGUgPSAiTm9ybWFsaXplZCBTZW50aW1lbnQgc2NvcmUgPSAoUG9zaXRpdmUgLSBOZWdhdGl2ZSkvVG90YWwgQ291bnQiLA0KICAgIGNhcHRpb24gPSAiRGF0YTogQXRlIFBvb3J0aHVpcyB8IENyZWF0aW9uOiBEcmFnb24gTWluaW9ucyINCiAgKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzIyMjExZCIpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMjIsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTcsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQzLCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIHNpemU9MTIsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDAuMywgcj0tOTksIHVuaXQgPSAiY20iKSApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43LCAwLjA5KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpDQogICkNCg0KI3ANCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JQ0KICBoaWdobGlnaHQoDQogICAgInBsb3RseV9ob3ZlciIsDQogICAgb3BhY2l0eURpbSA9IDENCiAgKQ0KYGBgDQoNCldlIGNhbiBvYnNlcnZlIHRoYXQgU2luZ2Fwb3JlYW5zIGFyZSBtYXJnaW5hbGx5IGhhcHBpZXIgb24gd2Vla2VuZHMgY29tcGFyZWQgdG8gd2Vla2RheXMuIEdlbmVyYWxseSwgc29jaWFsIG1lZGlhIHNlbnRpbWVudHMgYXJlIG1vcmUgbmVnYXRpdmUgaW4gaW5kdXN0cmlhbCBhcmVhcyBjb21wYXJlZCB0byByZXNpZGVudGlhbCBhcmVhcywgYW5kIGRvIG5vdCBjaGFuZ2UgbXVjaCByZWdhcmRsZXNzIG9mIHRoZSBkYXkuIFdlIGNhbiBhbHNvIG5vdGljZSBhIGNoYW5nZSBmcm9tIHNhZCB0byBoYXBweSBpbiByZWNyZWF0aW9uYWwgYXJlYXMgc3VjaCBhcyBFYXN0IENvYXN0IFBhcmsgYW5kIE9yY2hhcmQgUm9hZC4NCiAgDQogIA0KICANCioqQ2FzZSAyOiBTZW50aW1lbnRzIGFjcm9zcyB2YXJpb3VzIFRpbWUgUGVyaW9kcyoqIA0KDQpXZSB3aWxsIGJlIGRpdmlkaW5nIHRoZSBkYXRhIGludG8gNCB0aW1lIHBlcmlvZHM6IA0KDQoqIFNHVCAwMDowMCAtIDA1OjU5IA0KKiBTR1QgMDY6MDAgLSAxMTo1OSAgDQoqIFNHVCAxMjowMCAtIDE3OjU5IA0KKiBTR1QgMTg6MDAgLSAyMzo1OQ0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIFR3aXR0ZXINCiAgDQp0X3RpbWUxIDwtIHR3ZWV0cyAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPCA2KSAjIGZpbHRlciB0d2VldHMgbWFkZSBiZXR3ZWVuIDEyYW0gLSA2YW0NCiAgDQp0X3RpbWUyIDwtIHR3ZWV0cyAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPj0gNikgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpIDwgMTIpICMgZmlsdGVyIHR3ZWV0cyBtYWRlIGJldHdlZW4gNmFtIC0gMTJwbQ0KICANCnRfdGltZTMgPC0gdHdlZXRzICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA+PSAxMikgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpIDwgMTgpICMgZmlsdGVyIHR3ZWV0cyBtYWRlIGJldHdlZW4gMTJwbSAtIDZwbQ0KICANCnRfdGltZTQgPC0gdHdlZXRzICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA+PSAxOCkgIyBmaWx0ZXIgdHdlZXRzIG1hZGUgYmV0d2VlbiA2cG0gLSAxMmFtDQogIA0KIyBJbnN0YWdyYW0NCiAgDQppX3RpbWUxIDwtIGluc3RhICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA8IDYpICMgZmlsdGVyIGlncyBtYWRlIGJldHdlZW4gMTJhbSAtIDZhbQ0KICANCmlfdGltZTIgPC0gaW5zdGEgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpID49IDYpICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA8IDEyKSAjIGZpbHRlciBpZ3MgbWFkZSBiZXR3ZWVuIDZhbSAtIDEycG0NCiAgDQppX3RpbWUzIDwtIGluc3RhICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA+PSAxMikgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpIDwgMTgpICMgZmlsdGVyIGlncyBtYWRlIGJldHdlZW4gMTJwbSAtIDZwbQ0KICANCmlfdGltZTQgPC0gaW5zdGEgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpID49IDE4KSAjIGZpbHRlciBpZ3MgbWFkZSBiZXR3ZWVuIDZwbSAtIDEyYW0NCmBgYA0KICANCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFfQ0KIyBjb252ZXJ0IHRvIHNwIHBvaW50cyBhbmQgcG9seWdvbg0KdHdlZXRzIDwtIGRyb3BfbmEodF90aW1lMSkNCiMgcCA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHR3ZWV0cywgZGF0YS5mcmFtZShpZD0xOjcyODEzOCkpDQp0d2VldHMuc2YgPC0gc3RfYXNfc2YodHdlZXRzLCBjb29yZHMgPSBjKCdsb24nLCdsYXQnKSwgY3JzPTQzMjYpDQoNCmluc3RhIDwtIGRyb3BfbmEoaV90aW1lMSkNCmluc3RhLnNmIDwtIHN0X2FzX3NmKGluc3RhLCBjb29yZHM9YygnbG9uJywgJ2xhdCcpLCBjcnM9NDMyNikNCg0KIyBwYS5rbWwgPC0gc3RfcmVhZCgicGxhbm5pbmdfYXJlYS5rbWwiKQ0KIyBwYS5zZiA8LSBzdF9hc19zZihwYS5rbWwsIGNycz00MzI2KQ0KIyBwYS51dG0gPC0gYXMoc3Rfem0ocGEuc2YpLCAiU3BhdGlhbCIpDQojIHBhLnV0bSA8LSBnQnVmZmVyKHBhLnV0bSwgYnlpZD1UUlVFLCB3aWR0aD0wKSAjIGNsZWFuIHVwIHBvbHlnb25zDQojIHNoYXBlX3V0bSA8LSBzcFRyYW5zZm9ybShzaGFwZSwgQ1JTKHByb2o0c3RyaW5nKHNoYXBlKSkpDQpoZXhfZ3JpZCA8LSBtYWtlX2dyaWQoc2hhcGVfdXRtLCBjZWxsX2FyZWEgPSAwLjAwMDEsIGNsaXAgPSBUKQ0KaGV4LnNmIDwtIHN0X2FzX3NmKGhleF9ncmlkLCBjcnM9NDMyNikNCmhleC5zZiA8LSB0aWJibGU6OnJvd2lkX3RvX2NvbHVtbihoZXguc2YsICJoZXhJRCIpDQoNCiMgcG9pbnRzIGluIHBvbHlnb24NCmNvbG5hbWVzKHR3ZWV0cy5zZikgPC0gYygidC5uZWciLCAidC5uZXUiLCAidC5wb3MiLCAidC5jcmVhdGVkX2F0IiwgInQuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCmNvbG5hbWVzKGluc3RhLnNmKSA8LSBjKCJpLmNyZWF0ZWRfYXQiLCAiaS5wb3MiLCAiaS5uZXUiLCAiaS5uZWciLCAiaS5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KDQp0LmpvaW4gPC0gc3Rfam9pbih0d2VldHMuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCnQuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKHQuam9pbikNCnQuam9pbi5zdW1tYXJ5IDwtIHQuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UodC5jb3VudCA9IG4oKSwgdC5wb3MgPSBzdW0odC5wb3MpLCB0Lm5lZyA9IHN1bSh0Lm5lZyksIHQubmV1ID0gc3VtKHQubmV1KSkgDQppLmpvaW4gPC0gc3Rfam9pbihpbnN0YS5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KaS5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUoaS5qb2luKQ0KaS5qb2luLnN1bW1hcnkgPC0gaS5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZShpLmNvdW50ID0gbigpLCBpLnBvcyA9IHN1bShpLnBvcyksIGkubmVnID0gc3VtKGkubmVnKSwgaS5uZXUgPSBzdW0oaS5uZXUpKSANCg0KIyBBZGQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3NpbmcgaGV4YWdvbnMNCmZvciAoaSBpbiBoZXguc2YkaGV4SUQpIHsNCiAgaWYgKCEoaSAlaW4lIGkuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIGkuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKGkuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKGkuY291bnQ9MSwgaS5wb3M9MCwgaS5uZWc9MCwgaS5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCiAgaWYgKCEoaSAlaW4lIHQuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIHQuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKHQuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKHQuY291bnQ9MSwgdC5wb3M9MCwgdC5uZWc9MCwgdC5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCn0NCg0Kam9pbi5zdW1tYXJ5IDwtIG1lcmdlKHQuam9pbi5zdW1tYXJ5LCBpLmpvaW4uc3VtbWFyeSwgYnk9ImhleElEIikNCiNqb2luLnN1bW1hcnkgPC0gam9pbi5zdW1tYXJ5ICU+JSBzZWxlY3QoJ3QuY291bnQnLCAndC5wb3MnLCAndC5uZWcnLCAndC5uZXUnLCAnaS5jb3VudCcsICdpLnBvcycsICdpLm5lZycsICdpLm5ldScsICdoZXhJRCcpICU+JSBkcm9wX25hKCkNCg0Ka21sLmRhdGEgPC0gbWVyZ2Uoam9pbi5zdW1tYXJ5LCBoZXguc2YsIGJ5ID0gImhleElEIikgJT4lIHN0X2FzX3NmKCkNCmttbC5kYXRhIDwtIHN0X2FzX3NmKGttbC5kYXRhKQ0Ka21sLmRhdGEgPC0ga21sLmRhdGEgJT4lIG11dGF0ZSh0Lm5vcm0gPSAodC5wb3MtdC5uZWcpL3QuY291bnQsIGkubm9ybSA9IChpLnBvcy1pLm5lZykvaS5jb3VudCwgb2Rkcz10LnBvcy9pLnBvcykNCmttbC5kYXRhWyFpcy5maW5pdGUoa21sLmRhdGEkb2RkcyksXSRvZGRzIDwtIDANCiMgZ2dwbG90KGttbC5kYXRhKSArIGdlb21faGlzdG9ncmFtKGFlcyh4PW9kZHMpLCBiaW5zPTMwKQ0KDQojIFBsb3QgYSBoaXN0b2dyYW0gb2YgdGhlIG9kZHMNCnAgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBrbWwuZGF0YSwgYWVzKGZpbGw9b2RkcywgZ2VvbWV0cnk9Z2VvbWV0cnksIHRleHQ9cGFzdGUwKCJPZGRzIFJhdGlvOiAiLCBvZGRzKSksIGx3ZD0wKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9zZigpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXMoDQogICMgICBicmVha3M9YygwLDAuMjUsMC4zLDAuMzUsMC40LDAuNDUpLA0KICAjICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAjICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAjICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICMgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICMgICAgIG5yb3c9MSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoDQogICAgcGFsZXR0ZT0iU3BlY3RyYWwiLA0KICAgIGxpbWl0cz1jKDAsMiksDQogICAgYnJlYWtzPWMoMCwwLjMsMC42LDEsMS41LDIpLA0KICAgIG5hLnZhbHVlPSJncmV5IiwNCiAgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAgICAgbnJvdz0xKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlNlbnRpbWVudCBPZGRzIFJhdGlvIGZyb20gMDA6MDAgLSAwNTo1OSIsDQogICAgc3VidGl0bGUgPSAiTm9ybWFsaXplZCBTZW50aW1lbnQgc2NvcmUgPSAoUG9zaXRpdmUgLSBOZWdhdGl2ZSkvVG90YWwgQ291bnQiLA0KICAgIGNhcHRpb24gPSAiRGF0YTogQXRlIFBvb3J0aHVpcyB8IENyZWF0aW9uOiBEcmFnb24gTWluaW9ucyINCiAgKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzIyMjExZCIpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMjIsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTcsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQzLCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIHNpemU9MTIsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDAuMywgcj0tOTksIHVuaXQgPSAiY20iKSApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43LCAwLjA5KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpDQogICkNCg0KI3ANCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JQ0KICBoaWdobGlnaHQoDQogICAgInBsb3RseV9ob3ZlciIsDQogICAgb3BhY2l0eURpbSA9IDENCiAgKQ0KYGBgDQogIA0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIGNvbnZlcnQgdG8gc3AgcG9pbnRzIGFuZCBwb2x5Z29uDQp0d2VldHMgPC0gZHJvcF9uYSh0X3RpbWUyKQ0KIyBwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUodHdlZXRzLCBkYXRhLmZyYW1lKGlkPTE6NzI4MTM4KSkNCnR3ZWV0cy5zZiA8LSBzdF9hc19zZih0d2VldHMsIGNvb3JkcyA9IGMoJ2xvbicsJ2xhdCcpLCBjcnM9NDMyNikNCg0KaW5zdGEgPC0gZHJvcF9uYShpX3RpbWUyKQ0KaW5zdGEuc2YgPC0gc3RfYXNfc2YoaW5zdGEsIGNvb3Jkcz1jKCdsb24nLCAnbGF0JyksIGNycz00MzI2KQ0KDQojIHBhLmttbCA8LSBzdF9yZWFkKCJwbGFubmluZ19hcmVhLmttbCIpDQojIHBhLnNmIDwtIHN0X2FzX3NmKHBhLmttbCwgY3JzPTQzMjYpDQojIHBhLnV0bSA8LSBhcyhzdF96bShwYS5zZiksICJTcGF0aWFsIikNCiMgcGEudXRtIDwtIGdCdWZmZXIocGEudXRtLCBieWlkPVRSVUUsIHdpZHRoPTApICMgY2xlYW4gdXAgcG9seWdvbnMNCiMgc2hhcGVfdXRtIDwtIHNwVHJhbnNmb3JtKHNoYXBlLCBDUlMocHJvajRzdHJpbmcoc2hhcGUpKSkNCmhleF9ncmlkIDwtIG1ha2VfZ3JpZChzaGFwZV91dG0sIGNlbGxfYXJlYSA9IDAuMDAwMSwgY2xpcCA9IFQpDQpoZXguc2YgPC0gc3RfYXNfc2YoaGV4X2dyaWQsIGNycz00MzI2KQ0KaGV4LnNmIDwtIHRpYmJsZTo6cm93aWRfdG9fY29sdW1uKGhleC5zZiwgImhleElEIikNCg0KIyBwb2ludHMgaW4gcG9seWdvbg0KY29sbmFtZXModHdlZXRzLnNmKSA8LSBjKCJ0Lm5lZyIsICJ0Lm5ldSIsICJ0LnBvcyIsICJ0LmNyZWF0ZWRfYXQiLCAidC5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KY29sbmFtZXMoaW5zdGEuc2YpIDwtIGMoImkuY3JlYXRlZF9hdCIsICJpLnBvcyIsICJpLm5ldSIsICJpLm5lZyIsICJpLnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQoNCnQuam9pbiA8LSBzdF9qb2luKHR3ZWV0cy5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KdC5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUodC5qb2luKQ0KdC5qb2luLnN1bW1hcnkgPC0gdC5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZSh0LmNvdW50ID0gbigpLCB0LnBvcyA9IHN1bSh0LnBvcyksIHQubmVnID0gc3VtKHQubmVnKSwgdC5uZXUgPSBzdW0odC5uZXUpKSANCmkuam9pbiA8LSBzdF9qb2luKGluc3RhLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQppLmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZShpLmpvaW4pDQppLmpvaW4uc3VtbWFyeSA8LSBpLmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKGkuY291bnQgPSBuKCksIGkucG9zID0gc3VtKGkucG9zKSwgaS5uZWcgPSBzdW0oaS5uZWcpLCBpLm5ldSA9IHN1bShpLm5ldSkpIA0KDQojIEFkZCBkZWZhdWx0IHZhbHVlcyBmb3IgbWlzc2luZyBoZXhhZ29ucw0KZm9yIChpIGluIGhleC5zZiRoZXhJRCkgew0KICBpZiAoIShpICVpbiUgaS5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgaS5qb2luLnN1bW1hcnkgPC0gcmJpbmQoaS5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUoaS5jb3VudD0xLCBpLnBvcz0wLCBpLm5lZz0wLCBpLm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KICBpZiAoIShpICVpbiUgdC5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgdC5qb2luLnN1bW1hcnkgPC0gcmJpbmQodC5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUodC5jb3VudD0xLCB0LnBvcz0wLCB0Lm5lZz0wLCB0Lm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KfQ0KDQpqb2luLnN1bW1hcnkgPC0gbWVyZ2UodC5qb2luLnN1bW1hcnksIGkuam9pbi5zdW1tYXJ5LCBieT0iaGV4SUQiKQ0KI2pvaW4uc3VtbWFyeSA8LSBqb2luLnN1bW1hcnkgJT4lIHNlbGVjdCgndC5jb3VudCcsICd0LnBvcycsICd0Lm5lZycsICd0Lm5ldScsICdpLmNvdW50JywgJ2kucG9zJywgJ2kubmVnJywgJ2kubmV1JywgJ2hleElEJykgJT4lIGRyb3BfbmEoKQ0KDQprbWwuZGF0YSA8LSBtZXJnZShqb2luLnN1bW1hcnksIGhleC5zZiwgYnkgPSAiaGV4SUQiKSAlPiUgc3RfYXNfc2YoKQ0Ka21sLmRhdGEgPC0gc3RfYXNfc2Yoa21sLmRhdGEpDQprbWwuZGF0YSA8LSBrbWwuZGF0YSAlPiUgbXV0YXRlKHQubm9ybSA9ICh0LnBvcy10Lm5lZykvdC5jb3VudCwgaS5ub3JtID0gKGkucG9zLWkubmVnKS9pLmNvdW50LCBvZGRzPXQucG9zL2kucG9zKQ0Ka21sLmRhdGFbIWlzLmZpbml0ZShrbWwuZGF0YSRvZGRzKSxdJG9kZHMgPC0gMA0KIyBnZ3Bsb3Qoa21sLmRhdGEpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHg9b2RkcyksIGJpbnM9MzApDQoNCiMgUGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgb2Rkcw0KcCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IGttbC5kYXRhLCBhZXMoZmlsbD1vZGRzLCBnZW9tZXRyeT1nZW9tZXRyeSwgdGV4dD1wYXN0ZTAoIk9kZHMgUmF0aW86ICIsIG9kZHMpKSwgbHdkPTApICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX3NmKCkgKw0KICAjIHNjYWxlX2ZpbGxfdmlyaWRpcygNCiAgIyAgIGJyZWFrcz1jKDAsMC4yNSwwLjMsMC4zNSwwLjQsMC40NSksDQogICMgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICMgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICMgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgIyAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgIyAgICAgbnJvdz0xKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcigNCiAgICBwYWxldHRlPSJTcGVjdHJhbCIsDQogICAgbGltaXRzPWMoMCwyKSwNCiAgICBicmVha3M9YygwLDAuMywwLjYsMSwxLjUsMiksDQogICAgbmEudmFsdWU9ImdyZXkiLA0KICAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICAgICBucm93PTEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU2VudGltZW50IE9kZHMgUmF0aW8gZnJvbSAwNjowMCAtIDExOjU5IiwNCiAgICBzdWJ0aXRsZSA9ICJOb3JtYWxpemVkIFNlbnRpbWVudCBzY29yZSA9IChQb3NpdGl2ZSAtIE5lZ2F0aXZlKS9Ub3RhbCBDb3VudCIsDQogICAgY2FwdGlvbiA9ICJEYXRhOiBBdGUgUG9vcnRodWlzIHwgQ3JlYXRpb246IERyYWdvbiBNaW5pb25zIg0KICApICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMjIyMTFkIiksIA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAyMiwgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNCwgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAxNywgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNDMsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCggc2l6ZT0xMiwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gMC4zLCByPS05OSwgdW5pdCA9ICJjbSIpICksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjcsIDAuMDkpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JyksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JykNCiAgKQ0KDQojcA0KZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lDQogIGhpZ2hsaWdodCgNCiAgICAicGxvdGx5X2hvdmVyIiwNCiAgICBvcGFjaXR5RGltID0gMQ0KICApDQpgYGANCiAgDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRX0NCiMgY29udmVydCB0byBzcCBwb2ludHMgYW5kIHBvbHlnb24NCnR3ZWV0cyA8LSBkcm9wX25hKHRfdGltZTMpDQojIHAgPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSh0d2VldHMsIGRhdGEuZnJhbWUoaWQ9MTo3MjgxMzgpKQ0KdHdlZXRzLnNmIDwtIHN0X2FzX3NmKHR3ZWV0cywgY29vcmRzID0gYygnbG9uJywnbGF0JyksIGNycz00MzI2KQ0KDQppbnN0YSA8LSBkcm9wX25hKGlfdGltZTMpDQppbnN0YS5zZiA8LSBzdF9hc19zZihpbnN0YSwgY29vcmRzPWMoJ2xvbicsICdsYXQnKSwgY3JzPTQzMjYpDQoNCiMgcGEua21sIDwtIHN0X3JlYWQoInBsYW5uaW5nX2FyZWEua21sIikNCiMgcGEuc2YgPC0gc3RfYXNfc2YocGEua21sLCBjcnM9NDMyNikNCiMgcGEudXRtIDwtIGFzKHN0X3ptKHBhLnNmKSwgIlNwYXRpYWwiKQ0KIyBwYS51dG0gPC0gZ0J1ZmZlcihwYS51dG0sIGJ5aWQ9VFJVRSwgd2lkdGg9MCkgIyBjbGVhbiB1cCBwb2x5Z29ucw0KIyBzaGFwZV91dG0gPC0gc3BUcmFuc2Zvcm0oc2hhcGUsIENSUyhwcm9qNHN0cmluZyhzaGFwZSkpKQ0KaGV4X2dyaWQgPC0gbWFrZV9ncmlkKHNoYXBlX3V0bSwgY2VsbF9hcmVhID0gMC4wMDAxLCBjbGlwID0gVCkNCmhleC5zZiA8LSBzdF9hc19zZihoZXhfZ3JpZCwgY3JzPTQzMjYpDQpoZXguc2YgPC0gdGliYmxlOjpyb3dpZF90b19jb2x1bW4oaGV4LnNmLCAiaGV4SUQiKQ0KDQojIHBvaW50cyBpbiBwb2x5Z29uDQpjb2xuYW1lcyh0d2VldHMuc2YpIDwtIGMoInQubmVnIiwgInQubmV1IiwgInQucG9zIiwgInQuY3JlYXRlZF9hdCIsICJ0LnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQpjb2xuYW1lcyhpbnN0YS5zZikgPC0gYygiaS5jcmVhdGVkX2F0IiwgImkucG9zIiwgImkubmV1IiwgImkubmVnIiwgImkuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCg0KdC5qb2luIDwtIHN0X2pvaW4odHdlZXRzLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQp0LmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZSh0LmpvaW4pDQp0LmpvaW4uc3VtbWFyeSA8LSB0LmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKHQuY291bnQgPSBuKCksIHQucG9zID0gc3VtKHQucG9zKSwgdC5uZWcgPSBzdW0odC5uZWcpLCB0Lm5ldSA9IHN1bSh0Lm5ldSkpIA0KaS5qb2luIDwtIHN0X2pvaW4oaW5zdGEuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCmkuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKGkuam9pbikNCmkuam9pbi5zdW1tYXJ5IDwtIGkuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UoaS5jb3VudCA9IG4oKSwgaS5wb3MgPSBzdW0oaS5wb3MpLCBpLm5lZyA9IHN1bShpLm5lZyksIGkubmV1ID0gc3VtKGkubmV1KSkgDQoNCiMgQWRkIGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIGhleGFnb25zDQpmb3IgKGkgaW4gaGV4LnNmJGhleElEKSB7DQogIGlmICghKGkgJWluJSBpLmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICBpLmpvaW4uc3VtbWFyeSA8LSByYmluZChpLmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZShpLmNvdW50PTEsIGkucG9zPTAsIGkubmVnPTAsIGkubmV1PTAsIGhleElEPWkpKQ0KICB9DQogIGlmICghKGkgJWluJSB0LmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICB0LmpvaW4uc3VtbWFyeSA8LSByYmluZCh0LmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZSh0LmNvdW50PTEsIHQucG9zPTAsIHQubmVnPTAsIHQubmV1PTAsIGhleElEPWkpKQ0KICB9DQp9DQoNCmpvaW4uc3VtbWFyeSA8LSBtZXJnZSh0LmpvaW4uc3VtbWFyeSwgaS5qb2luLnN1bW1hcnksIGJ5PSJoZXhJRCIpDQojam9pbi5zdW1tYXJ5IDwtIGpvaW4uc3VtbWFyeSAlPiUgc2VsZWN0KCd0LmNvdW50JywgJ3QucG9zJywgJ3QubmVnJywgJ3QubmV1JywgJ2kuY291bnQnLCAnaS5wb3MnLCAnaS5uZWcnLCAnaS5uZXUnLCAnaGV4SUQnKSAlPiUgZHJvcF9uYSgpDQoNCmttbC5kYXRhIDwtIG1lcmdlKGpvaW4uc3VtbWFyeSwgaGV4LnNmLCBieSA9ICJoZXhJRCIpICU+JSBzdF9hc19zZigpDQprbWwuZGF0YSA8LSBzdF9hc19zZihrbWwuZGF0YSkNCmttbC5kYXRhIDwtIGttbC5kYXRhICU+JSBtdXRhdGUodC5ub3JtID0gKHQucG9zLXQubmVnKS90LmNvdW50LCBpLm5vcm0gPSAoaS5wb3MtaS5uZWcpL2kuY291bnQsIG9kZHM9dC5wb3MvaS5wb3MpDQprbWwuZGF0YVshaXMuZmluaXRlKGttbC5kYXRhJG9kZHMpLF0kb2RkcyA8LSAwDQojIGdncGxvdChrbWwuZGF0YSkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoeD1vZGRzKSwgYmlucz0zMCkNCg0KIyBQbG90IGEgaGlzdG9ncmFtIG9mIHRoZSBvZGRzDQpwIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0ga21sLmRhdGEsIGFlcyhmaWxsPW9kZHMsIGdlb21ldHJ5PWdlb21ldHJ5LCB0ZXh0PXBhc3RlMCgiT2RkcyBSYXRpbzogIiwgb2RkcykpLCBsd2Q9MCkgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgY29vcmRfc2YoKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzKA0KICAjICAgYnJlYWtzPWMoMCwwLjI1LDAuMywwLjM1LDAuNCwwLjQ1KSwNCiAgIyAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgIyAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgIyAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAjICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAjICAgICBucm93PTEpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKA0KICAgIHBhbGV0dGU9IlNwZWN0cmFsIiwNCiAgICBsaW1pdHM9YygwLDIpLA0KICAgIGJyZWFrcz1jKDAsMC4zLDAuNiwxLDEuNSwyKSwNCiAgICBuYS52YWx1ZT0iZ3JleSIsDQogICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgICAgIG5yb3c9MSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJTZW50aW1lbnQgT2RkcyBSYXRpbyBmcm9tIDEyOjAwIC0gMTc6NTkiLA0KICAgIHN1YnRpdGxlID0gIk5vcm1hbGl6ZWQgU2VudGltZW50IHNjb3JlID0gKFBvc2l0aXZlIC0gTmVnYXRpdmUpL1RvdGFsIENvdW50IiwNCiAgICBjYXB0aW9uID0gIkRhdGE6IEF0ZSBQb29ydGh1aXMgfCBDcmVhdGlvbjogRHJhZ29uIE1pbmlvbnMiDQogICkgKw0KICB0aGVtZSgNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiMyMjIxMWQiKSwgDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLCANCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLCANCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDIyLCBoanVzdD0wLjAxLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAtMC4xLCB0ID0gMC40LCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDE3LCBoanVzdD0wLjAxLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAtMC4xLCB0ID0gMC40MywgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KCBzaXplPTEyLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAwLjMsIHI9LTk5LCB1bml0ID0gImNtIikgKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNywgMC4wOSksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKSwgDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKQ0KICApDQoNCiNwDQpnZ3Bsb3RseShwLCB0b29sdGlwID0gInRleHQiKSAlPiUNCiAgaGlnaGxpZ2h0KA0KICAgICJwbG90bHlfaG92ZXIiLA0KICAgIG9wYWNpdHlEaW0gPSAxDQogICkNCmBgYA0KICANCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFfQ0KIyBjb252ZXJ0IHRvIHNwIHBvaW50cyBhbmQgcG9seWdvbg0KdHdlZXRzIDwtIGRyb3BfbmEodF90aW1lNCkNCiMgcCA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHR3ZWV0cywgZGF0YS5mcmFtZShpZD0xOjcyODEzOCkpDQp0d2VldHMuc2YgPC0gc3RfYXNfc2YodHdlZXRzLCBjb29yZHMgPSBjKCdsb24nLCdsYXQnKSwgY3JzPTQzMjYpDQoNCmluc3RhIDwtIGRyb3BfbmEoaV90aW1lNCkNCmluc3RhLnNmIDwtIHN0X2FzX3NmKGluc3RhLCBjb29yZHM9YygnbG9uJywgJ2xhdCcpLCBjcnM9NDMyNikNCg0KIyBwYS5rbWwgPC0gc3RfcmVhZCgicGxhbm5pbmdfYXJlYS5rbWwiKQ0KIyBwYS5zZiA8LSBzdF9hc19zZihwYS5rbWwsIGNycz00MzI2KQ0KIyBwYS51dG0gPC0gYXMoc3Rfem0ocGEuc2YpLCAiU3BhdGlhbCIpDQojIHBhLnV0bSA8LSBnQnVmZmVyKHBhLnV0bSwgYnlpZD1UUlVFLCB3aWR0aD0wKSAjIGNsZWFuIHVwIHBvbHlnb25zDQojIHNoYXBlX3V0bSA8LSBzcFRyYW5zZm9ybShzaGFwZSwgQ1JTKHByb2o0c3RyaW5nKHNoYXBlKSkpDQpoZXhfZ3JpZCA8LSBtYWtlX2dyaWQoc2hhcGVfdXRtLCBjZWxsX2FyZWEgPSAwLjAwMDEsIGNsaXAgPSBUKQ0KaGV4LnNmIDwtIHN0X2FzX3NmKGhleF9ncmlkLCBjcnM9NDMyNikNCmhleC5zZiA8LSB0aWJibGU6OnJvd2lkX3RvX2NvbHVtbihoZXguc2YsICJoZXhJRCIpDQoNCiMgcG9pbnRzIGluIHBvbHlnb24NCmNvbG5hbWVzKHR3ZWV0cy5zZikgPC0gYygidC5uZWciLCAidC5uZXUiLCAidC5wb3MiLCAidC5jcmVhdGVkX2F0IiwgInQuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCmNvbG5hbWVzKGluc3RhLnNmKSA8LSBjKCJpLmNyZWF0ZWRfYXQiLCAiaS5wb3MiLCAiaS5uZXUiLCAiaS5uZWciLCAiaS5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KDQp0LmpvaW4gPC0gc3Rfam9pbih0d2VldHMuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCnQuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKHQuam9pbikNCnQuam9pbi5zdW1tYXJ5IDwtIHQuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UodC5jb3VudCA9IG4oKSwgdC5wb3MgPSBzdW0odC5wb3MpLCB0Lm5lZyA9IHN1bSh0Lm5lZyksIHQubmV1ID0gc3VtKHQubmV1KSkgDQppLmpvaW4gPC0gc3Rfam9pbihpbnN0YS5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KaS5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUoaS5qb2luKQ0KaS5qb2luLnN1bW1hcnkgPC0gaS5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZShpLmNvdW50ID0gbigpLCBpLnBvcyA9IHN1bShpLnBvcyksIGkubmVnID0gc3VtKGkubmVnKSwgaS5uZXUgPSBzdW0oaS5uZXUpKSANCg0KIyBBZGQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3NpbmcgaGV4YWdvbnMNCmZvciAoaSBpbiBoZXguc2YkaGV4SUQpIHsNCiAgaWYgKCEoaSAlaW4lIGkuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIGkuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKGkuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKGkuY291bnQ9MSwgaS5wb3M9MCwgaS5uZWc9MCwgaS5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCiAgaWYgKCEoaSAlaW4lIHQuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIHQuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKHQuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKHQuY291bnQ9MSwgdC5wb3M9MCwgdC5uZWc9MCwgdC5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCn0NCg0Kam9pbi5zdW1tYXJ5IDwtIG1lcmdlKHQuam9pbi5zdW1tYXJ5LCBpLmpvaW4uc3VtbWFyeSwgYnk9ImhleElEIikNCiNqb2luLnN1bW1hcnkgPC0gam9pbi5zdW1tYXJ5ICU+JSBzZWxlY3QoJ3QuY291bnQnLCAndC5wb3MnLCAndC5uZWcnLCAndC5uZXUnLCAnaS5jb3VudCcsICdpLnBvcycsICdpLm5lZycsICdpLm5ldScsICdoZXhJRCcpICU+JSBkcm9wX25hKCkNCg0Ka21sLmRhdGEgPC0gbWVyZ2Uoam9pbi5zdW1tYXJ5LCBoZXguc2YsIGJ5ID0gImhleElEIikgJT4lIHN0X2FzX3NmKCkNCmttbC5kYXRhIDwtIHN0X2FzX3NmKGttbC5kYXRhKQ0Ka21sLmRhdGEgPC0ga21sLmRhdGEgJT4lIG11dGF0ZSh0Lm5vcm0gPSAodC5wb3MtdC5uZWcpL3QuY291bnQsIGkubm9ybSA9IChpLnBvcy1pLm5lZykvaS5jb3VudCwgb2Rkcz10LnBvcy9pLnBvcykNCmttbC5kYXRhWyFpcy5maW5pdGUoa21sLmRhdGEkb2RkcyksXSRvZGRzIDwtIDANCiMgZ2dwbG90KGttbC5kYXRhKSArIGdlb21faGlzdG9ncmFtKGFlcyh4PW9kZHMpLCBiaW5zPTMwKQ0KDQojIFBsb3QgYSBoaXN0b2dyYW0gb2YgdGhlIG9kZHMNCnAgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBrbWwuZGF0YSwgYWVzKGZpbGw9b2RkcywgZ2VvbWV0cnk9Z2VvbWV0cnksIHRleHQ9cGFzdGUwKCJPZGRzIFJhdGlvOiAiLCBvZGRzKSksIGx3ZD0wKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9zZigpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXMoDQogICMgICBicmVha3M9YygwLDAuMjUsMC4zLDAuMzUsMC40LDAuNDUpLA0KICAjICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAjICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAjICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICMgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICMgICAgIG5yb3c9MSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoDQogICAgcGFsZXR0ZT0iU3BlY3RyYWwiLA0KICAgIGxpbWl0cz1jKDAsMiksDQogICAgYnJlYWtzPWMoMCwwLjMsMC42LDEsMS41LDIpLA0KICAgIG5hLnZhbHVlPSJncmV5IiwNCiAgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAgICAgbnJvdz0xKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlNlbnRpbWVudCBPZGRzIFJhdGlvIGZyb20gMTg6MDAgLSAyMzo1OSIsDQogICAgc3VidGl0bGUgPSAiTm9ybWFsaXplZCBTZW50aW1lbnQgc2NvcmUgPSAoUG9zaXRpdmUgLSBOZWdhdGl2ZSkvVG90YWwgQ291bnQiLA0KICAgIGNhcHRpb24gPSAiRGF0YTogQXRlIFBvb3J0aHVpcyB8IENyZWF0aW9uOiBEcmFnb24gTWluaW9ucyINCiAgKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzIyMjExZCIpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMjIsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTcsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQzLCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIHNpemU9MTIsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDAuMywgcj0tOTksIHVuaXQgPSAiY20iKSApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43LCAwLjA5KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpDQogICkNCg0KI3ANCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JQ0KICBoaWdobGlnaHQoDQogICAgInBsb3RseV9ob3ZlciIsDQogICAgb3BhY2l0eURpbSA9IDENCiAgKQ0KYGBgDQogIA0KKipTb21lIGdlbmVyYWwgb2JzZXJ2YXRpb25zIHRoYXQgd2UgY2FuIG1ha2UgYmFzZWQgb24gdGltZSBwZXJpb2RzOioqICANCg0KKiBTaW5nYXBvcmVhbnMgYXJlIGhhcHBpZXN0IG9uIHNvY2lhbCBtZWRpYSBmcm9tIDEyOjAwIC0gMTc6NTkuICANCiogRnJvbSAxODowMCAtIDIzOjU5LCByZXNpZGVudGlhbCBhcmVhcyByZW1haW4gbGFyZ2VseSBoYXBweSwgd2hlcmVhcyB0aGUgaW5kdXN0cmlhbCBhcmVhcyAoU291dGggYW5kIFdlc3QgcGFydHMgb2YgU2luZ2Fwb3JlKSBhcmUgbGVhc3QgaGFwcHkgKHByb2JhYmx5IGR1ZSB0byB0aGUgbmVlZCB0byB3b3JrIG92ZXJ0aW1lKS4gIA0KKiBGcm9tIDAwOjAwIC0gMDU6NTksIHNlbnRpbWVudHMgYXJlIGxhcmdlbHkgdW5oYXBweSwgd2l0aCBzbWFsbCAiaGFwcHkiIGNsdXN0ZXJzIGFyb3VuZCBDaG9hIENodSBLYW5nLCBBbmcgTW8gS2lvLCBHZXlsYW5nLCBCZWRvayBhbmQgVGFtcGluZXMgYXJlYXMgKHBvc3NpYmx5IGFyZWFzIHdpdGggMjQvNyBmb29kIG9wdGlvbnMsIGFuZCBvdGhlciAqbmlnaHQgYWN0aXZpdGllcyopLg0KKiBUaGUgZWFzdCByZW1haW5zIGhhcHB5IHJlZ2FyZGxlc3Mgb2YgdGltZSBwZXJpb2QsIEkgd29uZGVyIHdoeS4gIA==
=======
LS0tDQp0aXRsZTogIk9kZHMgUmF0aW8gQ2FzZSBTdHVkaWVzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzcCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHJhc3RlcikNCmxpYnJhcnkocmdlb3MpDQpsaWJyYXJ5KHJnZGFsKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHJhc3RlclZpcykNCnJlcXVpcmUoc3BhdGlhbEVjbykNCmxpYnJhcnkocGxvdGx5KQ0KDQpzZXQuc2VlZCgxKQ0KDQojIFJldHJpZXZlZCB3aXRoIHRoYW5rcyBmcm9tIGh0dHA6Ly9zdHJpbWFzLmNvbS9zcGF0aWFsL2hleGFnb25hbC1ncmlkcy8NCm1ha2VfZ3JpZCA8LSBmdW5jdGlvbih4LCBjZWxsX2RpYW1ldGVyLCBjZWxsX2FyZWEsIGNsaXAgPSBGQUxTRSkgew0KICBpZiAobWlzc2luZyhjZWxsX2RpYW1ldGVyKSkgew0KICAgIGlmIChtaXNzaW5nKGNlbGxfYXJlYSkpIHsNCiAgICAgIHN0b3AoIk11c3QgcHJvdmlkZSBjZWxsX2RpYW1ldGVyIG9yIGNlbGxfYXJlYSIpDQogICAgfSBlbHNlIHsNCiAgICAgIGNlbGxfZGlhbWV0ZXIgPC0gc3FydCgyICogY2VsbF9hcmVhIC8gc3FydCgzKSkNCiAgICB9DQogIH0NCiAgZXh0IDwtIGFzKGV4dGVudCh4KSArIGNlbGxfZGlhbWV0ZXIsICJTcGF0aWFsUG9seWdvbnMiKQ0KICBwcm9qZWN0aW9uKGV4dCkgPC0gcHJvamVjdGlvbih4KQ0KICAjIGdlbmVyYXRlIGFycmF5IG9mIGhleGFnb24gY2VudGVycw0KICBnIDwtIHNwc2FtcGxlKGV4dCwgdHlwZSA9ICJoZXhhZ29uYWwiLCBjZWxsc2l6ZSA9IGNlbGxfZGlhbWV0ZXIsIA0KICAgICAgICAgICAgICAgIG9mZnNldCA9IGMoMC41LCAwLjUpKQ0KICAjIGNvbnZlcnQgY2VudGVyIHBvaW50cyB0byBoZXhhZ29ucw0KICBnIDwtIEhleFBvaW50czJTcGF0aWFsUG9seWdvbnMoZywgZHggPSBjZWxsX2RpYW1ldGVyKQ0KICAjIGNsaXAgdG8gYm91bmRhcnkgb2Ygc3R1ZHkgYXJlYSwuDQogIGlmIChjbGlwKSB7DQogICAgZyA8LSBnSW50ZXJzZWN0aW9uKGcsIHgsIGJ5aWQgPSBUUlVFKQ0KICB9IGVsc2Ugew0KICAgIGcgPC0gZ1t4LCBdDQogIH0NCiAgIyBjbGVhbiB1cCBmZWF0dXJlIElEcw0KICByb3cubmFtZXMoZykgPC0gYXMuY2hhcmFjdGVyKDE6bGVuZ3RoKGcpKQ0KICByZXR1cm4oZykNCn0NCiAgICANCiMgcmVhZCBpbiBmaWxlcw0KdHdlZXRzIDwtIHJlYWRfY3N2KCJlbW9qaV90cnVuYy5jc3YiKQ0KdHdlZXRzIDwtIHR3ZWV0cyAlPiUNCiAgbXV0YXRlKGRhdGUgPSBhc19kYXRldGltZShjcmVhdGVkX2F0LzEwMDAsIHR6ID0gIkFzaWEvU2luZ2Fwb3JlIikpICU+JQ0KICBtdXRhdGUod2Vla2RheSA9IHdkYXkoZGF0ZSkpDQppbnN0YSA8LSByZWFkX2NzdigiaW5zdGFncmFtX3RydW5jLmNzdiIpDQppbnN0YSA8LSBpbnN0YSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBhc19kYXRldGltZShjcmVhdGVkX2F0LzEwMDAsIHR6ID0gIkFzaWEvU2luZ2Fwb3JlIikpICU+JQ0KICBtdXRhdGUod2Vla2RheSA9IHdkYXkoZGF0ZSkpDQpzaGFwZSA8LSBpbnZpc2libGUocmVhZE9HUihkc24gPSAnc2ctc2hhcGUnLCBsYXllciA9J3NnLWFsbCcpKQ0Kc2hhcGUgPC0gZ0J1ZmZlcihzaGFwZSwgYnlpZD1UUlVFLCB3aWR0aD0wKSAjIGNsZWFuIHVwIHBvbHlnb25zDQpgYGANCg0KKipDYXNlIDE6IFNlbnRpbWVudHMgb24gV2Vla2RheXMgdnMgV2Vla2VuZHMqKg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFfQ0KdF93ZGF5IDwtIHR3ZWV0cyAlPiUNCiAgZmlsdGVyKHdlZWtkYXkgPCA2KSAjIGZpbHRlciBvbmx5IHR3ZWV0cyBtYWRlIG9uIHdlZWtkYXlzDQogIA0KdF93ZW5kIDwtIHR3ZWV0cyAlPiUNCiAgZmlsdGVyKHdlZWtkYXkgPiA1KSAjIGZpbHRlciBvbmx5IHR3ZWV0cyBtYWRlIG9uIHdlZWtlbmRzICANCiAgDQppX3dkYXkgPC0gaW5zdGEgJT4lDQogIGZpbHRlcih3ZWVrZGF5IDwgNikgIyBmaWx0ZXIgb25seSBpZ3MgbWFkZSBvbiB3ZWVrZGF5cw0KICANCmlfd2VuZCA8LSBpbnN0YSAlPiUNCiAgZmlsdGVyKHdlZWtkYXkgPiA1KSAjIGZpbHRlciBvbmx5IGlncyBtYWRlIG9uIHdlZWtlbmRzICANCmBgYA0KICANCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFfQ0KIyBjb252ZXJ0IHRvIHNwIHBvaW50cyBhbmQgcG9seWdvbg0KdHdlZXRzIDwtIGRyb3BfbmEodF93ZGF5KQ0KIyBwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUodHdlZXRzLCBkYXRhLmZyYW1lKGlkPTE6NzI4MTM4KSkNCnR3ZWV0cy5zZiA8LSBzdF9hc19zZih0d2VldHMsIGNvb3JkcyA9IGMoJ2xvbicsJ2xhdCcpLCBjcnM9NDMyNikNCg0KaW5zdGEgPC0gZHJvcF9uYShpX3dkYXkpDQppbnN0YS5zZiA8LSBzdF9hc19zZihpbnN0YSwgY29vcmRzPWMoJ2xvbicsICdsYXQnKSwgY3JzPTQzMjYpDQoNCiMgcGEua21sIDwtIHN0X3JlYWQoInBsYW5uaW5nX2FyZWEua21sIikNCiMgcGEuc2YgPC0gc3RfYXNfc2YocGEua21sLCBjcnM9NDMyNikNCiMgcGEudXRtIDwtIGFzKHN0X3ptKHBhLnNmKSwgIlNwYXRpYWwiKQ0KIyBwYS51dG0gPC0gZ0J1ZmZlcihwYS51dG0sIGJ5aWQ9VFJVRSwgd2lkdGg9MCkgIyBjbGVhbiB1cCBwb2x5Z29ucw0KIyBzaGFwZV91dG0gPC0gc3BUcmFuc2Zvcm0oc2hhcGUsIENSUyhwcm9qNHN0cmluZyhzaGFwZSkpKQ0KaGV4X2dyaWQgPC0gbWFrZV9ncmlkKHNoYXBlX3V0bSwgY2VsbF9hcmVhID0gMC4wMDAxLCBjbGlwID0gVCkNCmhleC5zZiA8LSBzdF9hc19zZihoZXhfZ3JpZCwgY3JzPTQzMjYpDQpoZXguc2YgPC0gdGliYmxlOjpyb3dpZF90b19jb2x1bW4oaGV4LnNmLCAiaGV4SUQiKQ0KDQojIHBvaW50cyBpbiBwb2x5Z29uDQpjb2xuYW1lcyh0d2VldHMuc2YpIDwtIGMoInQubmVnIiwgInQubmV1IiwgInQucG9zIiwgInQuY3JlYXRlZF9hdCIsICJ0LnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQpjb2xuYW1lcyhpbnN0YS5zZikgPC0gYygiaS5jcmVhdGVkX2F0IiwgImkucG9zIiwgImkubmV1IiwgImkubmVnIiwgImkuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCg0KdC5qb2luIDwtIHN0X2pvaW4odHdlZXRzLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQp0LmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZSh0LmpvaW4pDQp0LmpvaW4uc3VtbWFyeSA8LSB0LmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKHQuY291bnQgPSBuKCksIHQucG9zID0gc3VtKHQucG9zKSwgdC5uZWcgPSBzdW0odC5uZWcpLCB0Lm5ldSA9IHN1bSh0Lm5ldSkpIA0KaS5qb2luIDwtIHN0X2pvaW4oaW5zdGEuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCmkuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKGkuam9pbikNCmkuam9pbi5zdW1tYXJ5IDwtIGkuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UoaS5jb3VudCA9IG4oKSwgaS5wb3MgPSBzdW0oaS5wb3MpLCBpLm5lZyA9IHN1bShpLm5lZyksIGkubmV1ID0gc3VtKGkubmV1KSkgDQoNCiMgQWRkIGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIGhleGFnb25zDQpmb3IgKGkgaW4gaGV4LnNmJGhleElEKSB7DQogIGlmICghKGkgJWluJSBpLmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICBpLmpvaW4uc3VtbWFyeSA8LSByYmluZChpLmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZShpLmNvdW50PTEsIGkucG9zPTAsIGkubmVnPTAsIGkubmV1PTAsIGhleElEPWkpKQ0KICB9DQogIGlmICghKGkgJWluJSB0LmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICB0LmpvaW4uc3VtbWFyeSA8LSByYmluZCh0LmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZSh0LmNvdW50PTEsIHQucG9zPTAsIHQubmVnPTAsIHQubmV1PTAsIGhleElEPWkpKQ0KICB9DQp9DQoNCmpvaW4uc3VtbWFyeSA8LSBtZXJnZSh0LmpvaW4uc3VtbWFyeSwgaS5qb2luLnN1bW1hcnksIGJ5PSJoZXhJRCIpDQojam9pbi5zdW1tYXJ5IDwtIGpvaW4uc3VtbWFyeSAlPiUgc2VsZWN0KCd0LmNvdW50JywgJ3QucG9zJywgJ3QubmVnJywgJ3QubmV1JywgJ2kuY291bnQnLCAnaS5wb3MnLCAnaS5uZWcnLCAnaS5uZXUnLCAnaGV4SUQnKSAlPiUgZHJvcF9uYSgpDQoNCmttbC5kYXRhIDwtIG1lcmdlKGpvaW4uc3VtbWFyeSwgaGV4LnNmLCBieSA9ICJoZXhJRCIpICU+JSBzdF9hc19zZigpDQprbWwuZGF0YSA8LSBzdF9hc19zZihrbWwuZGF0YSkNCmttbC5kYXRhIDwtIGttbC5kYXRhICU+JSBtdXRhdGUodC5ub3JtID0gKHQucG9zLXQubmVnKS90LmNvdW50LCBpLm5vcm0gPSAoaS5wb3MtaS5uZWcpL2kuY291bnQsIG9kZHM9dC5wb3MvaS5wb3MpDQprbWwuZGF0YVshaXMuZmluaXRlKGttbC5kYXRhJG9kZHMpLF0kb2RkcyA8LSAwDQojIGdncGxvdChrbWwuZGF0YSkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoeD1vZGRzKSwgYmlucz0zMCkNCg0KIyBQbG90IGEgaGlzdG9ncmFtIG9mIHRoZSBvZGRzDQpwIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0ga21sLmRhdGEsIGFlcyhmaWxsPW9kZHMsIGdlb21ldHJ5PWdlb21ldHJ5LCB0ZXh0PXBhc3RlMCgiT2RkcyBSYXRpbzogIiwgb2RkcykpLCBsd2Q9MCkgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgY29vcmRfc2YoKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzKA0KICAjICAgYnJlYWtzPWMoMCwwLjI1LDAuMywwLjM1LDAuNCwwLjQ1KSwNCiAgIyAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgIyAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgIyAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAjICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAjICAgICBucm93PTEpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKA0KICAgIHBhbGV0dGU9IlNwZWN0cmFsIiwNCiAgICBsaW1pdHM9YygwLDIpLA0KICAgIGJyZWFrcz1jKDAsMC4zLDAuNiwxLDEuNSwyKSwNCiAgICBuYS52YWx1ZT0iZ3JleSIsDQogICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgICAgIG5yb3c9MSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJTZW50aW1lbnQgT2RkcyBSYXRpbyBvbiBXZWVrZGF5cyIsDQogICAgc3VidGl0bGUgPSAiTm9ybWFsaXplZCBTZW50aW1lbnQgc2NvcmUgPSAoUG9zaXRpdmUgLSBOZWdhdGl2ZSkvVG90YWwgQ291bnQiLA0KICAgIGNhcHRpb24gPSAiRGF0YTogQXRlIFBvb3J0aHVpcyB8IENyZWF0aW9uOiBEcmFnb24gTWluaW9ucyINCiAgKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzIyMjExZCIpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMjIsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTcsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQzLCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIHNpemU9MTIsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDAuMywgcj0tOTksIHVuaXQgPSAiY20iKSApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43LCAwLjA5KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpDQogICkNCg0KI3ANCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JQ0KICBoaWdobGlnaHQoDQogICAgInBsb3RseV9ob3ZlciIsDQogICAgb3BhY2l0eURpbSA9IDENCiAgKQ0KYGBgDQogIA0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIGNvbnZlcnQgdG8gc3AgcG9pbnRzIGFuZCBwb2x5Z29uDQp0d2VldHMgPC0gZHJvcF9uYSh0X3dlbmQpDQojIHAgPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSh0d2VldHMsIGRhdGEuZnJhbWUoaWQ9MTo3MjgxMzgpKQ0KdHdlZXRzLnNmIDwtIHN0X2FzX3NmKHR3ZWV0cywgY29vcmRzID0gYygnbG9uJywnbGF0JyksIGNycz00MzI2KQ0KDQppbnN0YSA8LSBkcm9wX25hKGlfd2VuZCkNCmluc3RhLnNmIDwtIHN0X2FzX3NmKGluc3RhLCBjb29yZHM9YygnbG9uJywgJ2xhdCcpLCBjcnM9NDMyNikNCg0KIyBwYS5rbWwgPC0gc3RfcmVhZCgicGxhbm5pbmdfYXJlYS5rbWwiKQ0KIyBwYS5zZiA8LSBzdF9hc19zZihwYS5rbWwsIGNycz00MzI2KQ0KIyBwYS51dG0gPC0gYXMoc3Rfem0ocGEuc2YpLCAiU3BhdGlhbCIpDQojIHBhLnV0bSA8LSBnQnVmZmVyKHBhLnV0bSwgYnlpZD1UUlVFLCB3aWR0aD0wKSAjIGNsZWFuIHVwIHBvbHlnb25zDQojIHNoYXBlX3V0bSA8LSBzcFRyYW5zZm9ybShzaGFwZSwgQ1JTKHByb2o0c3RyaW5nKHNoYXBlKSkpDQpoZXhfZ3JpZCA8LSBtYWtlX2dyaWQoc2hhcGVfdXRtLCBjZWxsX2FyZWEgPSAwLjAwMDEsIGNsaXAgPSBUKQ0KaGV4LnNmIDwtIHN0X2FzX3NmKGhleF9ncmlkLCBjcnM9NDMyNikNCmhleC5zZiA8LSB0aWJibGU6OnJvd2lkX3RvX2NvbHVtbihoZXguc2YsICJoZXhJRCIpDQoNCiMgcG9pbnRzIGluIHBvbHlnb24NCmNvbG5hbWVzKHR3ZWV0cy5zZikgPC0gYygidC5uZWciLCAidC5uZXUiLCAidC5wb3MiLCAidC5jcmVhdGVkX2F0IiwgInQuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCmNvbG5hbWVzKGluc3RhLnNmKSA8LSBjKCJpLmNyZWF0ZWRfYXQiLCAiaS5wb3MiLCAiaS5uZXUiLCAiaS5uZWciLCAiaS5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KDQp0LmpvaW4gPC0gc3Rfam9pbih0d2VldHMuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCnQuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKHQuam9pbikNCnQuam9pbi5zdW1tYXJ5IDwtIHQuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UodC5jb3VudCA9IG4oKSwgdC5wb3MgPSBzdW0odC5wb3MpLCB0Lm5lZyA9IHN1bSh0Lm5lZyksIHQubmV1ID0gc3VtKHQubmV1KSkgDQppLmpvaW4gPC0gc3Rfam9pbihpbnN0YS5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KaS5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUoaS5qb2luKQ0KaS5qb2luLnN1bW1hcnkgPC0gaS5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZShpLmNvdW50ID0gbigpLCBpLnBvcyA9IHN1bShpLnBvcyksIGkubmVnID0gc3VtKGkubmVnKSwgaS5uZXUgPSBzdW0oaS5uZXUpKSANCg0KIyBBZGQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3NpbmcgaGV4YWdvbnMNCmZvciAoaSBpbiBoZXguc2YkaGV4SUQpIHsNCiAgaWYgKCEoaSAlaW4lIGkuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIGkuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKGkuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKGkuY291bnQ9MSwgaS5wb3M9MCwgaS5uZWc9MCwgaS5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCiAgaWYgKCEoaSAlaW4lIHQuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIHQuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKHQuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKHQuY291bnQ9MSwgdC5wb3M9MCwgdC5uZWc9MCwgdC5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCn0NCg0Kam9pbi5zdW1tYXJ5IDwtIG1lcmdlKHQuam9pbi5zdW1tYXJ5LCBpLmpvaW4uc3VtbWFyeSwgYnk9ImhleElEIikNCiNqb2luLnN1bW1hcnkgPC0gam9pbi5zdW1tYXJ5ICU+JSBzZWxlY3QoJ3QuY291bnQnLCAndC5wb3MnLCAndC5uZWcnLCAndC5uZXUnLCAnaS5jb3VudCcsICdpLnBvcycsICdpLm5lZycsICdpLm5ldScsICdoZXhJRCcpICU+JSBkcm9wX25hKCkNCg0Ka21sLmRhdGEgPC0gbWVyZ2Uoam9pbi5zdW1tYXJ5LCBoZXguc2YsIGJ5ID0gImhleElEIikgJT4lIHN0X2FzX3NmKCkNCmttbC5kYXRhIDwtIHN0X2FzX3NmKGttbC5kYXRhKQ0Ka21sLmRhdGEgPC0ga21sLmRhdGEgJT4lIG11dGF0ZSh0Lm5vcm0gPSAodC5wb3MtdC5uZWcpL3QuY291bnQsIGkubm9ybSA9IChpLnBvcy1pLm5lZykvaS5jb3VudCwgb2Rkcz10LnBvcy9pLnBvcykNCmttbC5kYXRhWyFpcy5maW5pdGUoa21sLmRhdGEkb2RkcyksXSRvZGRzIDwtIDANCiMgZ2dwbG90KGttbC5kYXRhKSArIGdlb21faGlzdG9ncmFtKGFlcyh4PW9kZHMpLCBiaW5zPTMwKQ0KDQojIFBsb3QgYSBoaXN0b2dyYW0gb2YgdGhlIG9kZHMNCnAgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBrbWwuZGF0YSwgYWVzKGZpbGw9b2RkcywgZ2VvbWV0cnk9Z2VvbWV0cnksIHRleHQ9cGFzdGUwKCJPZGRzIFJhdGlvOiAiLCBvZGRzKSksIGx3ZD0wKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9zZigpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXMoDQogICMgICBicmVha3M9YygwLDAuMjUsMC4zLDAuMzUsMC40LDAuNDUpLA0KICAjICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAjICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAjICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICMgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICMgICAgIG5yb3c9MSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoDQogICAgcGFsZXR0ZT0iU3BlY3RyYWwiLA0KICAgIGxpbWl0cz1jKDAsMiksDQogICAgYnJlYWtzPWMoMCwwLjMsMC42LDEsMS41LDIpLA0KICAgIG5hLnZhbHVlPSJncmV5IiwNCiAgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAgICAgbnJvdz0xKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlNlbnRpbWVudCBPZGRzIFJhdGlvIG9uIFdlZWtlbmRzIiwNCiAgICBzdWJ0aXRsZSA9ICJOb3JtYWxpemVkIFNlbnRpbWVudCBzY29yZSA9IChQb3NpdGl2ZSAtIE5lZ2F0aXZlKS9Ub3RhbCBDb3VudCIsDQogICAgY2FwdGlvbiA9ICJEYXRhOiBBdGUgUG9vcnRodWlzIHwgQ3JlYXRpb246IERyYWdvbiBNaW5pb25zIg0KICApICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMjIyMTFkIiksIA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAyMiwgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNCwgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAxNywgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNDMsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCggc2l6ZT0xMiwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gMC4zLCByPS05OSwgdW5pdCA9ICJjbSIpICksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjcsIDAuMDkpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JyksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JykNCiAgKQ0KDQojcA0KZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lDQogIGhpZ2hsaWdodCgNCiAgICAicGxvdGx5X2hvdmVyIiwNCiAgICBvcGFjaXR5RGltID0gMQ0KICApDQpgYGANCiAgDQogIA0KKipDYXNlIDI6IFNlbnRpbWVudHMgYWNyb3NzIHZhcmlvdXMgVGltZSBQZXJpb2RzKiogDQoNCldlIHdpbGwgYmUgZGl2aWRpbmcgdGhlIGRhdGEgaW50byA0IHRpbWUgcGVyaW9kczogDQoNCiogU0dUIDAwOjAwIC0gMDU6NTkgDQoqIFNHVCAwNjowMCAtIDExOjU5ICANCiogU0dUIDEyOjAwIC0gMTc6NTkgDQoqIFNHVCAxODowMCAtIDIzOjU5DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRX0NCiMgVHdpdHRlcg0KICANCnRfdGltZTEgPC0gdHdlZXRzICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA8IDYpICMgZmlsdGVyIHR3ZWV0cyBtYWRlIGJldHdlZW4gMTJhbSAtIDZhbQ0KICANCnRfdGltZTIgPC0gdHdlZXRzICU+JQ0KICBmaWx0ZXIoaG91cihkYXRlKSA+PSA2KSAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPCAxMikgIyBmaWx0ZXIgdHdlZXRzIG1hZGUgYmV0d2VlbiA2YW0gLSAxMnBtDQogIA0KdF90aW1lMyA8LSB0d2VldHMgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpID49IDEyKSAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPCAxOCkgIyBmaWx0ZXIgdHdlZXRzIG1hZGUgYmV0d2VlbiAxMnBtIC0gNnBtDQogIA0KdF90aW1lNCA8LSB0d2VldHMgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpID49IDE4KSAjIGZpbHRlciB0d2VldHMgbWFkZSBiZXR3ZWVuIDZwbSAtIDEyYW0NCiAgDQojIEluc3RhZ3JhbQ0KICANCmlfdGltZTEgPC0gaW5zdGEgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpIDwgNikgIyBmaWx0ZXIgaWdzIG1hZGUgYmV0d2VlbiAxMmFtIC0gNmFtDQogIA0KaV90aW1lMiA8LSBpbnN0YSAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPj0gNikgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpIDwgMTIpICMgZmlsdGVyIGlncyBtYWRlIGJldHdlZW4gNmFtIC0gMTJwbQ0KICANCmlfdGltZTMgPC0gaW5zdGEgJT4lDQogIGZpbHRlcihob3VyKGRhdGUpID49IDEyKSAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPCAxOCkgIyBmaWx0ZXIgaWdzIG1hZGUgYmV0d2VlbiAxMnBtIC0gNnBtDQogIA0KaV90aW1lNCA8LSBpbnN0YSAlPiUNCiAgZmlsdGVyKGhvdXIoZGF0ZSkgPj0gMTgpICMgZmlsdGVyIGlncyBtYWRlIGJldHdlZW4gNnBtIC0gMTJhbQ0KYGBgDQogIA0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIGNvbnZlcnQgdG8gc3AgcG9pbnRzIGFuZCBwb2x5Z29uDQp0d2VldHMgPC0gZHJvcF9uYSh0X3RpbWUxKQ0KIyBwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUodHdlZXRzLCBkYXRhLmZyYW1lKGlkPTE6NzI4MTM4KSkNCnR3ZWV0cy5zZiA8LSBzdF9hc19zZih0d2VldHMsIGNvb3JkcyA9IGMoJ2xvbicsJ2xhdCcpLCBjcnM9NDMyNikNCg0KaW5zdGEgPC0gZHJvcF9uYShpX3RpbWUxKQ0KaW5zdGEuc2YgPC0gc3RfYXNfc2YoaW5zdGEsIGNvb3Jkcz1jKCdsb24nLCAnbGF0JyksIGNycz00MzI2KQ0KDQojIHBhLmttbCA8LSBzdF9yZWFkKCJwbGFubmluZ19hcmVhLmttbCIpDQojIHBhLnNmIDwtIHN0X2FzX3NmKHBhLmttbCwgY3JzPTQzMjYpDQojIHBhLnV0bSA8LSBhcyhzdF96bShwYS5zZiksICJTcGF0aWFsIikNCiMgcGEudXRtIDwtIGdCdWZmZXIocGEudXRtLCBieWlkPVRSVUUsIHdpZHRoPTApICMgY2xlYW4gdXAgcG9seWdvbnMNCiMgc2hhcGVfdXRtIDwtIHNwVHJhbnNmb3JtKHNoYXBlLCBDUlMocHJvajRzdHJpbmcoc2hhcGUpKSkNCmhleF9ncmlkIDwtIG1ha2VfZ3JpZChzaGFwZV91dG0sIGNlbGxfYXJlYSA9IDAuMDAwMSwgY2xpcCA9IFQpDQpoZXguc2YgPC0gc3RfYXNfc2YoaGV4X2dyaWQsIGNycz00MzI2KQ0KaGV4LnNmIDwtIHRpYmJsZTo6cm93aWRfdG9fY29sdW1uKGhleC5zZiwgImhleElEIikNCg0KIyBwb2ludHMgaW4gcG9seWdvbg0KY29sbmFtZXModHdlZXRzLnNmKSA8LSBjKCJ0Lm5lZyIsICJ0Lm5ldSIsICJ0LnBvcyIsICJ0LmNyZWF0ZWRfYXQiLCAidC5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KY29sbmFtZXMoaW5zdGEuc2YpIDwtIGMoImkuY3JlYXRlZF9hdCIsICJpLnBvcyIsICJpLm5ldSIsICJpLm5lZyIsICJpLnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQoNCnQuam9pbiA8LSBzdF9qb2luKHR3ZWV0cy5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KdC5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUodC5qb2luKQ0KdC5qb2luLnN1bW1hcnkgPC0gdC5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZSh0LmNvdW50ID0gbigpLCB0LnBvcyA9IHN1bSh0LnBvcyksIHQubmVnID0gc3VtKHQubmVnKSwgdC5uZXUgPSBzdW0odC5uZXUpKSANCmkuam9pbiA8LSBzdF9qb2luKGluc3RhLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQppLmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZShpLmpvaW4pDQppLmpvaW4uc3VtbWFyeSA8LSBpLmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKGkuY291bnQgPSBuKCksIGkucG9zID0gc3VtKGkucG9zKSwgaS5uZWcgPSBzdW0oaS5uZWcpLCBpLm5ldSA9IHN1bShpLm5ldSkpIA0KDQojIEFkZCBkZWZhdWx0IHZhbHVlcyBmb3IgbWlzc2luZyBoZXhhZ29ucw0KZm9yIChpIGluIGhleC5zZiRoZXhJRCkgew0KICBpZiAoIShpICVpbiUgaS5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgaS5qb2luLnN1bW1hcnkgPC0gcmJpbmQoaS5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUoaS5jb3VudD0xLCBpLnBvcz0wLCBpLm5lZz0wLCBpLm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KICBpZiAoIShpICVpbiUgdC5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgdC5qb2luLnN1bW1hcnkgPC0gcmJpbmQodC5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUodC5jb3VudD0xLCB0LnBvcz0wLCB0Lm5lZz0wLCB0Lm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KfQ0KDQpqb2luLnN1bW1hcnkgPC0gbWVyZ2UodC5qb2luLnN1bW1hcnksIGkuam9pbi5zdW1tYXJ5LCBieT0iaGV4SUQiKQ0KI2pvaW4uc3VtbWFyeSA8LSBqb2luLnN1bW1hcnkgJT4lIHNlbGVjdCgndC5jb3VudCcsICd0LnBvcycsICd0Lm5lZycsICd0Lm5ldScsICdpLmNvdW50JywgJ2kucG9zJywgJ2kubmVnJywgJ2kubmV1JywgJ2hleElEJykgJT4lIGRyb3BfbmEoKQ0KDQprbWwuZGF0YSA8LSBtZXJnZShqb2luLnN1bW1hcnksIGhleC5zZiwgYnkgPSAiaGV4SUQiKSAlPiUgc3RfYXNfc2YoKQ0Ka21sLmRhdGEgPC0gc3RfYXNfc2Yoa21sLmRhdGEpDQprbWwuZGF0YSA8LSBrbWwuZGF0YSAlPiUgbXV0YXRlKHQubm9ybSA9ICh0LnBvcy10Lm5lZykvdC5jb3VudCwgaS5ub3JtID0gKGkucG9zLWkubmVnKS9pLmNvdW50LCBvZGRzPXQucG9zL2kucG9zKQ0Ka21sLmRhdGFbIWlzLmZpbml0ZShrbWwuZGF0YSRvZGRzKSxdJG9kZHMgPC0gMA0KIyBnZ3Bsb3Qoa21sLmRhdGEpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHg9b2RkcyksIGJpbnM9MzApDQoNCiMgUGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgb2Rkcw0KcCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IGttbC5kYXRhLCBhZXMoZmlsbD1vZGRzLCBnZW9tZXRyeT1nZW9tZXRyeSwgdGV4dD1wYXN0ZTAoIk9kZHMgUmF0aW86ICIsIG9kZHMpKSwgbHdkPTApICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX3NmKCkgKw0KICAjIHNjYWxlX2ZpbGxfdmlyaWRpcygNCiAgIyAgIGJyZWFrcz1jKDAsMC4yNSwwLjMsMC4zNSwwLjQsMC40NSksDQogICMgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICMgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICMgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgIyAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgIyAgICAgbnJvdz0xKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcigNCiAgICBwYWxldHRlPSJTcGVjdHJhbCIsDQogICAgbGltaXRzPWMoMCwyKSwNCiAgICBicmVha3M9YygwLDAuMywwLjYsMSwxLjUsMiksDQogICAgbmEudmFsdWU9ImdyZXkiLA0KICAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICAgICBucm93PTEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU2VudGltZW50IE9kZHMgUmF0aW8gZnJvbSAwMDowMCAtIDA1OjU5IiwNCiAgICBzdWJ0aXRsZSA9ICJOb3JtYWxpemVkIFNlbnRpbWVudCBzY29yZSA9IChQb3NpdGl2ZSAtIE5lZ2F0aXZlKS9Ub3RhbCBDb3VudCIsDQogICAgY2FwdGlvbiA9ICJEYXRhOiBBdGUgUG9vcnRodWlzIHwgQ3JlYXRpb246IERyYWdvbiBNaW5pb25zIg0KICApICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMjIyMTFkIiksIA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAyMiwgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNCwgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAxNywgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNDMsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCggc2l6ZT0xMiwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gMC4zLCByPS05OSwgdW5pdCA9ICJjbSIpICksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjcsIDAuMDkpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JyksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JykNCiAgKQ0KDQojcA0KZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lDQogIGhpZ2hsaWdodCgNCiAgICAicGxvdGx5X2hvdmVyIiwNCiAgICBvcGFjaXR5RGltID0gMQ0KICApDQpgYGANCiAgDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRX0NCiMgY29udmVydCB0byBzcCBwb2ludHMgYW5kIHBvbHlnb24NCnR3ZWV0cyA8LSBkcm9wX25hKHRfdGltZTIpDQojIHAgPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSh0d2VldHMsIGRhdGEuZnJhbWUoaWQ9MTo3MjgxMzgpKQ0KdHdlZXRzLnNmIDwtIHN0X2FzX3NmKHR3ZWV0cywgY29vcmRzID0gYygnbG9uJywnbGF0JyksIGNycz00MzI2KQ0KDQppbnN0YSA8LSBkcm9wX25hKGlfdGltZTIpDQppbnN0YS5zZiA8LSBzdF9hc19zZihpbnN0YSwgY29vcmRzPWMoJ2xvbicsICdsYXQnKSwgY3JzPTQzMjYpDQoNCiMgcGEua21sIDwtIHN0X3JlYWQoInBsYW5uaW5nX2FyZWEua21sIikNCiMgcGEuc2YgPC0gc3RfYXNfc2YocGEua21sLCBjcnM9NDMyNikNCiMgcGEudXRtIDwtIGFzKHN0X3ptKHBhLnNmKSwgIlNwYXRpYWwiKQ0KIyBwYS51dG0gPC0gZ0J1ZmZlcihwYS51dG0sIGJ5aWQ9VFJVRSwgd2lkdGg9MCkgIyBjbGVhbiB1cCBwb2x5Z29ucw0KIyBzaGFwZV91dG0gPC0gc3BUcmFuc2Zvcm0oc2hhcGUsIENSUyhwcm9qNHN0cmluZyhzaGFwZSkpKQ0KaGV4X2dyaWQgPC0gbWFrZV9ncmlkKHNoYXBlX3V0bSwgY2VsbF9hcmVhID0gMC4wMDAxLCBjbGlwID0gVCkNCmhleC5zZiA8LSBzdF9hc19zZihoZXhfZ3JpZCwgY3JzPTQzMjYpDQpoZXguc2YgPC0gdGliYmxlOjpyb3dpZF90b19jb2x1bW4oaGV4LnNmLCAiaGV4SUQiKQ0KDQojIHBvaW50cyBpbiBwb2x5Z29uDQpjb2xuYW1lcyh0d2VldHMuc2YpIDwtIGMoInQubmVnIiwgInQubmV1IiwgInQucG9zIiwgInQuY3JlYXRlZF9hdCIsICJ0LnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQpjb2xuYW1lcyhpbnN0YS5zZikgPC0gYygiaS5jcmVhdGVkX2F0IiwgImkucG9zIiwgImkubmV1IiwgImkubmVnIiwgImkuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCg0KdC5qb2luIDwtIHN0X2pvaW4odHdlZXRzLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQp0LmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZSh0LmpvaW4pDQp0LmpvaW4uc3VtbWFyeSA8LSB0LmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKHQuY291bnQgPSBuKCksIHQucG9zID0gc3VtKHQucG9zKSwgdC5uZWcgPSBzdW0odC5uZWcpLCB0Lm5ldSA9IHN1bSh0Lm5ldSkpIA0KaS5qb2luIDwtIHN0X2pvaW4oaW5zdGEuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCmkuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKGkuam9pbikNCmkuam9pbi5zdW1tYXJ5IDwtIGkuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UoaS5jb3VudCA9IG4oKSwgaS5wb3MgPSBzdW0oaS5wb3MpLCBpLm5lZyA9IHN1bShpLm5lZyksIGkubmV1ID0gc3VtKGkubmV1KSkgDQoNCiMgQWRkIGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIGhleGFnb25zDQpmb3IgKGkgaW4gaGV4LnNmJGhleElEKSB7DQogIGlmICghKGkgJWluJSBpLmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICBpLmpvaW4uc3VtbWFyeSA8LSByYmluZChpLmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZShpLmNvdW50PTEsIGkucG9zPTAsIGkubmVnPTAsIGkubmV1PTAsIGhleElEPWkpKQ0KICB9DQogIGlmICghKGkgJWluJSB0LmpvaW4uc3VtbWFyeSRoZXhJRCkpIHsNCiAgICB0LmpvaW4uc3VtbWFyeSA8LSByYmluZCh0LmpvaW4uc3VtbWFyeSwgZGF0YS5mcmFtZSh0LmNvdW50PTEsIHQucG9zPTAsIHQubmVnPTAsIHQubmV1PTAsIGhleElEPWkpKQ0KICB9DQp9DQoNCmpvaW4uc3VtbWFyeSA8LSBtZXJnZSh0LmpvaW4uc3VtbWFyeSwgaS5qb2luLnN1bW1hcnksIGJ5PSJoZXhJRCIpDQojam9pbi5zdW1tYXJ5IDwtIGpvaW4uc3VtbWFyeSAlPiUgc2VsZWN0KCd0LmNvdW50JywgJ3QucG9zJywgJ3QubmVnJywgJ3QubmV1JywgJ2kuY291bnQnLCAnaS5wb3MnLCAnaS5uZWcnLCAnaS5uZXUnLCAnaGV4SUQnKSAlPiUgZHJvcF9uYSgpDQoNCmttbC5kYXRhIDwtIG1lcmdlKGpvaW4uc3VtbWFyeSwgaGV4LnNmLCBieSA9ICJoZXhJRCIpICU+JSBzdF9hc19zZigpDQprbWwuZGF0YSA8LSBzdF9hc19zZihrbWwuZGF0YSkNCmttbC5kYXRhIDwtIGttbC5kYXRhICU+JSBtdXRhdGUodC5ub3JtID0gKHQucG9zLXQubmVnKS90LmNvdW50LCBpLm5vcm0gPSAoaS5wb3MtaS5uZWcpL2kuY291bnQsIG9kZHM9dC5wb3MvaS5wb3MpDQprbWwuZGF0YVshaXMuZmluaXRlKGttbC5kYXRhJG9kZHMpLF0kb2RkcyA8LSAwDQojIGdncGxvdChrbWwuZGF0YSkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoeD1vZGRzKSwgYmlucz0zMCkNCg0KIyBQbG90IGEgaGlzdG9ncmFtIG9mIHRoZSBvZGRzDQpwIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0ga21sLmRhdGEsIGFlcyhmaWxsPW9kZHMsIGdlb21ldHJ5PWdlb21ldHJ5LCB0ZXh0PXBhc3RlMCgiT2RkcyBSYXRpbzogIiwgb2RkcykpLCBsd2Q9MCkgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgY29vcmRfc2YoKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzKA0KICAjICAgYnJlYWtzPWMoMCwwLjI1LDAuMywwLjM1LDAuNCwwLjQ1KSwNCiAgIyAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgIyAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgIyAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAjICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAjICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAjICAgICBucm93PTEpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKA0KICAgIHBhbGV0dGU9IlNwZWN0cmFsIiwNCiAgICBsaW1pdHM9YygwLDIpLA0KICAgIGJyZWFrcz1jKDAsMC4zLDAuNiwxLDEuNSwyKSwNCiAgICBuYS52YWx1ZT0iZ3JleSIsDQogICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAgIGd1aWRlPWd1aWRlX2xlZ2VuZCgNCiAgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICAgICBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgICAgIG5yb3c9MSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJTZW50aW1lbnQgT2RkcyBSYXRpbyBmcm9tIDA2OjAwIC0gMTE6NTkiLA0KICAgIHN1YnRpdGxlID0gIk5vcm1hbGl6ZWQgU2VudGltZW50IHNjb3JlID0gKFBvc2l0aXZlIC0gTmVnYXRpdmUpL1RvdGFsIENvdW50IiwNCiAgICBjYXB0aW9uID0gIkRhdGE6IEF0ZSBQb29ydGh1aXMgfCBDcmVhdGlvbjogRHJhZ29uIE1pbmlvbnMiDQogICkgKw0KICB0aGVtZSgNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiMyMjIxMWQiKSwgDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLCANCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLCANCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDIyLCBoanVzdD0wLjAxLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAtMC4xLCB0ID0gMC40LCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDE3LCBoanVzdD0wLjAxLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAtMC4xLCB0ID0gMC40MywgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KCBzaXplPTEyLCBjb2xvciA9ICIjNGU0ZDQ3IiwgbWFyZ2luID0gbWFyZ2luKGIgPSAwLjMsIHI9LTk5LCB1bml0ID0gImNtIikgKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNywgMC4wOSksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKSwgDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKQ0KICApDQoNCiNwDQpnZ3Bsb3RseShwLCB0b29sdGlwID0gInRleHQiKSAlPiUNCiAgaGlnaGxpZ2h0KA0KICAgICJwbG90bHlfaG92ZXIiLA0KICAgIG9wYWNpdHlEaW0gPSAxDQogICkNCmBgYA0KICANCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlcnJvciA9IEZBTFNFfQ0KIyBjb252ZXJ0IHRvIHNwIHBvaW50cyBhbmQgcG9seWdvbg0KdHdlZXRzIDwtIGRyb3BfbmEodF90aW1lMykNCiMgcCA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHR3ZWV0cywgZGF0YS5mcmFtZShpZD0xOjcyODEzOCkpDQp0d2VldHMuc2YgPC0gc3RfYXNfc2YodHdlZXRzLCBjb29yZHMgPSBjKCdsb24nLCdsYXQnKSwgY3JzPTQzMjYpDQoNCmluc3RhIDwtIGRyb3BfbmEoaV90aW1lMykNCmluc3RhLnNmIDwtIHN0X2FzX3NmKGluc3RhLCBjb29yZHM9YygnbG9uJywgJ2xhdCcpLCBjcnM9NDMyNikNCg0KIyBwYS5rbWwgPC0gc3RfcmVhZCgicGxhbm5pbmdfYXJlYS5rbWwiKQ0KIyBwYS5zZiA8LSBzdF9hc19zZihwYS5rbWwsIGNycz00MzI2KQ0KIyBwYS51dG0gPC0gYXMoc3Rfem0ocGEuc2YpLCAiU3BhdGlhbCIpDQojIHBhLnV0bSA8LSBnQnVmZmVyKHBhLnV0bSwgYnlpZD1UUlVFLCB3aWR0aD0wKSAjIGNsZWFuIHVwIHBvbHlnb25zDQojIHNoYXBlX3V0bSA8LSBzcFRyYW5zZm9ybShzaGFwZSwgQ1JTKHByb2o0c3RyaW5nKHNoYXBlKSkpDQpoZXhfZ3JpZCA8LSBtYWtlX2dyaWQoc2hhcGVfdXRtLCBjZWxsX2FyZWEgPSAwLjAwMDEsIGNsaXAgPSBUKQ0KaGV4LnNmIDwtIHN0X2FzX3NmKGhleF9ncmlkLCBjcnM9NDMyNikNCmhleC5zZiA8LSB0aWJibGU6OnJvd2lkX3RvX2NvbHVtbihoZXguc2YsICJoZXhJRCIpDQoNCiMgcG9pbnRzIGluIHBvbHlnb24NCmNvbG5hbWVzKHR3ZWV0cy5zZikgPC0gYygidC5uZWciLCAidC5uZXUiLCAidC5wb3MiLCAidC5jcmVhdGVkX2F0IiwgInQuc2VudCIsICJkYXRldGltZSIsICJ3ZGF5IiwgImdlb21ldHJ5IikNCmNvbG5hbWVzKGluc3RhLnNmKSA8LSBjKCJpLmNyZWF0ZWRfYXQiLCAiaS5wb3MiLCAiaS5uZXUiLCAiaS5uZWciLCAiaS5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KDQp0LmpvaW4gPC0gc3Rfam9pbih0d2VldHMuc2YsIGhleC5zZiwgam9pbiA9IHN0X3dpdGhpbikNCnQuam9pbi5kZiA8LSBhcy5kYXRhLmZyYW1lKHQuam9pbikNCnQuam9pbi5zdW1tYXJ5IDwtIHQuam9pbi5kZiAlPiUgZ3JvdXBfYnkoaGV4SUQpICU+JSBzdW1tYXJpc2UodC5jb3VudCA9IG4oKSwgdC5wb3MgPSBzdW0odC5wb3MpLCB0Lm5lZyA9IHN1bSh0Lm5lZyksIHQubmV1ID0gc3VtKHQubmV1KSkgDQppLmpvaW4gPC0gc3Rfam9pbihpbnN0YS5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KaS5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUoaS5qb2luKQ0KaS5qb2luLnN1bW1hcnkgPC0gaS5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZShpLmNvdW50ID0gbigpLCBpLnBvcyA9IHN1bShpLnBvcyksIGkubmVnID0gc3VtKGkubmVnKSwgaS5uZXUgPSBzdW0oaS5uZXUpKSANCg0KIyBBZGQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3NpbmcgaGV4YWdvbnMNCmZvciAoaSBpbiBoZXguc2YkaGV4SUQpIHsNCiAgaWYgKCEoaSAlaW4lIGkuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIGkuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKGkuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKGkuY291bnQ9MSwgaS5wb3M9MCwgaS5uZWc9MCwgaS5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCiAgaWYgKCEoaSAlaW4lIHQuam9pbi5zdW1tYXJ5JGhleElEKSkgew0KICAgIHQuam9pbi5zdW1tYXJ5IDwtIHJiaW5kKHQuam9pbi5zdW1tYXJ5LCBkYXRhLmZyYW1lKHQuY291bnQ9MSwgdC5wb3M9MCwgdC5uZWc9MCwgdC5uZXU9MCwgaGV4SUQ9aSkpDQogIH0NCn0NCg0Kam9pbi5zdW1tYXJ5IDwtIG1lcmdlKHQuam9pbi5zdW1tYXJ5LCBpLmpvaW4uc3VtbWFyeSwgYnk9ImhleElEIikNCiNqb2luLnN1bW1hcnkgPC0gam9pbi5zdW1tYXJ5ICU+JSBzZWxlY3QoJ3QuY291bnQnLCAndC5wb3MnLCAndC5uZWcnLCAndC5uZXUnLCAnaS5jb3VudCcsICdpLnBvcycsICdpLm5lZycsICdpLm5ldScsICdoZXhJRCcpICU+JSBkcm9wX25hKCkNCg0Ka21sLmRhdGEgPC0gbWVyZ2Uoam9pbi5zdW1tYXJ5LCBoZXguc2YsIGJ5ID0gImhleElEIikgJT4lIHN0X2FzX3NmKCkNCmttbC5kYXRhIDwtIHN0X2FzX3NmKGttbC5kYXRhKQ0Ka21sLmRhdGEgPC0ga21sLmRhdGEgJT4lIG11dGF0ZSh0Lm5vcm0gPSAodC5wb3MtdC5uZWcpL3QuY291bnQsIGkubm9ybSA9IChpLnBvcy1pLm5lZykvaS5jb3VudCwgb2Rkcz10LnBvcy9pLnBvcykNCmttbC5kYXRhWyFpcy5maW5pdGUoa21sLmRhdGEkb2RkcyksXSRvZGRzIDwtIDANCiMgZ2dwbG90KGttbC5kYXRhKSArIGdlb21faGlzdG9ncmFtKGFlcyh4PW9kZHMpLCBiaW5zPTMwKQ0KDQojIFBsb3QgYSBoaXN0b2dyYW0gb2YgdGhlIG9kZHMNCnAgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBrbWwuZGF0YSwgYWVzKGZpbGw9b2RkcywgZ2VvbWV0cnk9Z2VvbWV0cnksIHRleHQ9cGFzdGUwKCJPZGRzIFJhdGlvOiAiLCBvZGRzKSksIGx3ZD0wKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9zZigpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXMoDQogICMgICBicmVha3M9YygwLDAuMjUsMC4zLDAuMzUsMC40LDAuNDUpLA0KICAjICAgbmFtZT0iTm9ybWFsaXplZCBTZW50aW1lbnQiLA0KICAjICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAjICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGtleXdpZHRoPXVuaXQoMTIsIHVuaXRzID0gIm1tIiksDQogICMgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICMgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICMgICAgIG5yb3c9MSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoDQogICAgcGFsZXR0ZT0iU3BlY3RyYWwiLA0KICAgIGxpbWl0cz1jKDAsMiksDQogICAgYnJlYWtzPWMoMCwwLjMsMC42LDEsMS41LDIpLA0KICAgIG5hLnZhbHVlPSJncmV5IiwNCiAgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKA0KICAgICAga2V5aGVpZ2h0ID0gdW5pdCgzLCB1bml0cyA9ICJtbSIpLA0KICAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgICAgIGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICB0aXRsZS5wb3NpdGlvbiA9ICd0b3AnLA0KICAgICAgbnJvdz0xKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlNlbnRpbWVudCBPZGRzIFJhdGlvIGZyb20gMTI6MDAgLSAxNzo1OSIsDQogICAgc3VidGl0bGUgPSAiTm9ybWFsaXplZCBTZW50aW1lbnQgc2NvcmUgPSAoUG9zaXRpdmUgLSBOZWdhdGl2ZSkvVG90YWwgQ291bnQiLA0KICAgIGNhcHRpb24gPSAiRGF0YTogQXRlIFBvb3J0aHVpcyB8IENyZWF0aW9uOiBEcmFnb24gTWluaW9ucyINCiAgKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzIyMjExZCIpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksIA0KICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMjIsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTcsIGhqdXN0PTAuMDEsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IC0wLjEsIHQgPSAwLjQzLCBsID0gMiwgdW5pdCA9ICJjbSIpKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIHNpemU9MTIsIGNvbG9yID0gIiM0ZTRkNDciLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDAuMywgcj0tOTksIHVuaXQgPSAiY20iKSApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43LCAwLjA5KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpDQogICkNCg0KI3ANCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JQ0KICBoaWdobGlnaHQoDQogICAgInBsb3RseV9ob3ZlciIsDQogICAgb3BhY2l0eURpbSA9IDENCiAgKQ0KYGBgDQogIA0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIGNvbnZlcnQgdG8gc3AgcG9pbnRzIGFuZCBwb2x5Z29uDQp0d2VldHMgPC0gZHJvcF9uYSh0X3RpbWU0KQ0KIyBwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUodHdlZXRzLCBkYXRhLmZyYW1lKGlkPTE6NzI4MTM4KSkNCnR3ZWV0cy5zZiA8LSBzdF9hc19zZih0d2VldHMsIGNvb3JkcyA9IGMoJ2xvbicsJ2xhdCcpLCBjcnM9NDMyNikNCg0KaW5zdGEgPC0gZHJvcF9uYShpX3RpbWU0KQ0KaW5zdGEuc2YgPC0gc3RfYXNfc2YoaW5zdGEsIGNvb3Jkcz1jKCdsb24nLCAnbGF0JyksIGNycz00MzI2KQ0KDQojIHBhLmttbCA8LSBzdF9yZWFkKCJwbGFubmluZ19hcmVhLmttbCIpDQojIHBhLnNmIDwtIHN0X2FzX3NmKHBhLmttbCwgY3JzPTQzMjYpDQojIHBhLnV0bSA8LSBhcyhzdF96bShwYS5zZiksICJTcGF0aWFsIikNCiMgcGEudXRtIDwtIGdCdWZmZXIocGEudXRtLCBieWlkPVRSVUUsIHdpZHRoPTApICMgY2xlYW4gdXAgcG9seWdvbnMNCiMgc2hhcGVfdXRtIDwtIHNwVHJhbnNmb3JtKHNoYXBlLCBDUlMocHJvajRzdHJpbmcoc2hhcGUpKSkNCmhleF9ncmlkIDwtIG1ha2VfZ3JpZChzaGFwZV91dG0sIGNlbGxfYXJlYSA9IDAuMDAwMSwgY2xpcCA9IFQpDQpoZXguc2YgPC0gc3RfYXNfc2YoaGV4X2dyaWQsIGNycz00MzI2KQ0KaGV4LnNmIDwtIHRpYmJsZTo6cm93aWRfdG9fY29sdW1uKGhleC5zZiwgImhleElEIikNCg0KIyBwb2ludHMgaW4gcG9seWdvbg0KY29sbmFtZXModHdlZXRzLnNmKSA8LSBjKCJ0Lm5lZyIsICJ0Lm5ldSIsICJ0LnBvcyIsICJ0LmNyZWF0ZWRfYXQiLCAidC5zZW50IiwgImRhdGV0aW1lIiwgIndkYXkiLCAiZ2VvbWV0cnkiKQ0KY29sbmFtZXMoaW5zdGEuc2YpIDwtIGMoImkuY3JlYXRlZF9hdCIsICJpLnBvcyIsICJpLm5ldSIsICJpLm5lZyIsICJpLnNlbnQiLCAiZGF0ZXRpbWUiLCAid2RheSIsICJnZW9tZXRyeSIpDQoNCnQuam9pbiA8LSBzdF9qb2luKHR3ZWV0cy5zZiwgaGV4LnNmLCBqb2luID0gc3Rfd2l0aGluKQ0KdC5qb2luLmRmIDwtIGFzLmRhdGEuZnJhbWUodC5qb2luKQ0KdC5qb2luLnN1bW1hcnkgPC0gdC5qb2luLmRmICU+JSBncm91cF9ieShoZXhJRCkgJT4lIHN1bW1hcmlzZSh0LmNvdW50ID0gbigpLCB0LnBvcyA9IHN1bSh0LnBvcyksIHQubmVnID0gc3VtKHQubmVnKSwgdC5uZXUgPSBzdW0odC5uZXUpKSANCmkuam9pbiA8LSBzdF9qb2luKGluc3RhLnNmLCBoZXguc2YsIGpvaW4gPSBzdF93aXRoaW4pDQppLmpvaW4uZGYgPC0gYXMuZGF0YS5mcmFtZShpLmpvaW4pDQppLmpvaW4uc3VtbWFyeSA8LSBpLmpvaW4uZGYgJT4lIGdyb3VwX2J5KGhleElEKSAlPiUgc3VtbWFyaXNlKGkuY291bnQgPSBuKCksIGkucG9zID0gc3VtKGkucG9zKSwgaS5uZWcgPSBzdW0oaS5uZWcpLCBpLm5ldSA9IHN1bShpLm5ldSkpIA0KDQojIEFkZCBkZWZhdWx0IHZhbHVlcyBmb3IgbWlzc2luZyBoZXhhZ29ucw0KZm9yIChpIGluIGhleC5zZiRoZXhJRCkgew0KICBpZiAoIShpICVpbiUgaS5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgaS5qb2luLnN1bW1hcnkgPC0gcmJpbmQoaS5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUoaS5jb3VudD0xLCBpLnBvcz0wLCBpLm5lZz0wLCBpLm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KICBpZiAoIShpICVpbiUgdC5qb2luLnN1bW1hcnkkaGV4SUQpKSB7DQogICAgdC5qb2luLnN1bW1hcnkgPC0gcmJpbmQodC5qb2luLnN1bW1hcnksIGRhdGEuZnJhbWUodC5jb3VudD0xLCB0LnBvcz0wLCB0Lm5lZz0wLCB0Lm5ldT0wLCBoZXhJRD1pKSkNCiAgfQ0KfQ0KDQpqb2luLnN1bW1hcnkgPC0gbWVyZ2UodC5qb2luLnN1bW1hcnksIGkuam9pbi5zdW1tYXJ5LCBieT0iaGV4SUQiKQ0KI2pvaW4uc3VtbWFyeSA8LSBqb2luLnN1bW1hcnkgJT4lIHNlbGVjdCgndC5jb3VudCcsICd0LnBvcycsICd0Lm5lZycsICd0Lm5ldScsICdpLmNvdW50JywgJ2kucG9zJywgJ2kubmVnJywgJ2kubmV1JywgJ2hleElEJykgJT4lIGRyb3BfbmEoKQ0KDQprbWwuZGF0YSA8LSBtZXJnZShqb2luLnN1bW1hcnksIGhleC5zZiwgYnkgPSAiaGV4SUQiKSAlPiUgc3RfYXNfc2YoKQ0Ka21sLmRhdGEgPC0gc3RfYXNfc2Yoa21sLmRhdGEpDQprbWwuZGF0YSA8LSBrbWwuZGF0YSAlPiUgbXV0YXRlKHQubm9ybSA9ICh0LnBvcy10Lm5lZykvdC5jb3VudCwgaS5ub3JtID0gKGkucG9zLWkubmVnKS9pLmNvdW50LCBvZGRzPXQucG9zL2kucG9zKQ0Ka21sLmRhdGFbIWlzLmZpbml0ZShrbWwuZGF0YSRvZGRzKSxdJG9kZHMgPC0gMA0KIyBnZ3Bsb3Qoa21sLmRhdGEpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHg9b2RkcyksIGJpbnM9MzApDQoNCiMgUGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgb2Rkcw0KcCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IGttbC5kYXRhLCBhZXMoZmlsbD1vZGRzLCBnZW9tZXRyeT1nZW9tZXRyeSwgdGV4dD1wYXN0ZTAoIk9kZHMgUmF0aW86ICIsIG9kZHMpKSwgbHdkPTApICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX3NmKCkgKw0KICAjIHNjYWxlX2ZpbGxfdmlyaWRpcygNCiAgIyAgIGJyZWFrcz1jKDAsMC4yNSwwLjMsMC4zNSwwLjQsMC40NSksDQogICMgICBuYW1lPSJOb3JtYWxpemVkIFNlbnRpbWVudCIsDQogICMgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICMgICAgIGtleWhlaWdodCA9IHVuaXQoMywgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAga2V5d2lkdGg9dW5pdCgxMiwgdW5pdHMgPSAibW0iKSwNCiAgIyAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgIyAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywNCiAgIyAgICAgbnJvdz0xKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcigNCiAgICBwYWxldHRlPSJTcGVjdHJhbCIsDQogICAgbGltaXRzPWMoMCwyKSwNCiAgICBicmVha3M9YygwLDAuMywwLjYsMSwxLjUsMiksDQogICAgbmEudmFsdWU9ImdyZXkiLA0KICAgIG5hbWU9Ik5vcm1hbGl6ZWQgU2VudGltZW50IiwNCiAgICBndWlkZT1ndWlkZV9sZWdlbmQoDQogICAgICBrZXloZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksDQogICAgICBrZXl3aWR0aD11bml0KDEyLCB1bml0cyA9ICJtbSIpLA0KICAgICAgbGFiZWwucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsDQogICAgICBucm93PTEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU2VudGltZW50IE9kZHMgUmF0aW8gZnJvbSAxODowMCAtIDIzOjU5IiwNCiAgICBzdWJ0aXRsZSA9ICJOb3JtYWxpemVkIFNlbnRpbWVudCBzY29yZSA9IChQb3NpdGl2ZSAtIE5lZ2F0aXZlKS9Ub3RhbCBDb3VudCIsDQogICAgY2FwdGlvbiA9ICJEYXRhOiBBdGUgUG9vcnRodWlzIHwgQ3JlYXRpb246IERyYWdvbiBNaW5pb25zIg0KICApICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMjIyMTFkIiksIA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmNWY1ZjIiLCBjb2xvciA9IE5BKSwgDQogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjVmNWYyIiwgY29sb3IgPSBOQSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAyMiwgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNCwgbCA9IDIsIHVuaXQgPSAiY20iKSksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAxNywgaGp1c3Q9MC4wMSwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gLTAuMSwgdCA9IDAuNDMsIGwgPSAyLCB1bml0ID0gImNtIikpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCggc2l6ZT0xMiwgY29sb3IgPSAiIzRlNGQ0NyIsIG1hcmdpbiA9IG1hcmdpbihiID0gMC4zLCByPS05OSwgdW5pdCA9ICJjbSIpICksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjcsIDAuMDkpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JyksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JykNCiAgKQ0KDQojcA0KZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lDQogIGhpZ2hsaWdodCgNCiAgICAicGxvdGx5X2hvdmVyIiwNCiAgICBvcGFjaXR5RGltID0gMQ0KICApDQpgYGA=
>>>>>>> parent of 6a02bda... Updated writeup